在R中运行非平衡因变量的Bivariate Probit Model报错求助
问题分析与解决
报错根源
你遇到的错误和警告源于两个核心问题:
- 模型类型与数据结构不匹配:你的研究是「先建模是否受害,再在受害者中建模是否多次受害」,属于样本选择模型(Heckman-type模型),但你误用了普通联合双变量Probit(
model = "B")。polyvictimization10仅在polyvictimization9=1时有有效值,其余为NA,普通双变量Probit无法处理这种选择性缺失,导致计算残差相关系数时出现标准差为0的异常。 - 小样本拟合不稳定:
polyvictimization10仅31个有效样本,容易引发模型拟合的数值问题(比如完全分离)。
解决方案
1. 切换为样本选择型双变量Probit模型
GJRM包支持样本选择模型,只需指定model = "S",并明确区分选择方程(是否受害)和结果方程(是否多次受害):
library(GJRM) # 拟合样本选择模型 bl_pdu <- gjrm( list( selection = polyvictimization9 ~ yrsaddr_1 + yrsaddr_2 + cartot_1, # 选择方程:是否受害 outcome = polyvictimization10 ~ cartot_1 + cartot_2 # 结果方程:受害者中是否多次受害 ), data = pdu, margins = c("probit", "probit"), model = "S" # 关键:指定为样本选择模型 ) # 查看模型结果 summary(bl_pdu)
2. 排查数据与变量问题
如果修改后仍报错,按以下步骤排查:
- 检查结果变量分布:查看
polyvictimization10的取值分布(table(pdu$polyvictimization10, useNA = "no")),如果某一类样本量过少(如<5),考虑合并类别或补充样本; - 检查自变量变异:用
sapply(pdu[, c("yrsaddr_1", "yrsaddr_2", "cartot_1", "cartot_2")], sd)查看自变量标准差,排除零变异变量; - 检查共线性:用
cor(pdu[, c("yrsaddr_1", "yrsaddr_2", "cartot_1", "cartot_2")])查看自变量相关性,移除高度共线性的变量。
内容的提问来源于stack exchange,提问作者OLu
相关产品推荐
相关产品推荐

