我一直在比较R中的泊松,负二项式(NB)以及零膨胀的Poisson和NB模型。我的因变量是广义焦虑症(GAD
)的症状计数,而我的预测变量是两个人格特质(禁忌[ZDis_winz
和卑鄙[ZMean_winz
]),它们的相互作用以及年龄和评估位点的协变量(虚拟编码;有8个位点,所以我有7个这些虚拟变量) 。我有一个1206个具有完整数据的样本(这些是数据框中包含的唯一个人)。
我正在针对这种疾病使用NB模型,因为方差(〜40)远远超过了平均值(〜4)。考虑到样本中约30%的症状为0,我也想考虑ZINB模型的可能性。
对于其他症状计数(例如,品行障碍),我在R中运行ZINB模型非常好,但是当我对GAD模型执行完全相同的操作时却出现了错误。标准的NB模型对于GAD可以正常工作;只是GAD ZINB模型出了错。
这是我收到的错误:
solve.default(as.matrix(fit $ hessian))中的错误: 系统在计算上是奇异的:倒数条件数= 4.80021e-36
这是我用于(工作中的)NB模型的代码:
summary(
NB_GAD_uw_int <- glm.nb(
dawbac_bl_GAD_sxs_uw ~ ZMean_winz + ZDis_winz + ZMean_winz*ZDis_winz + age_years + Nottingham_dummy + Dublin_dummy + Berlin_dummy + Hamburg_dummy + Mannheim_dummy + Paris_dummy + Dresden_dummy,
data=eurodata))
这是我用于(无效)ZINB模型的代码(与我为其他疾病运行的其他ZINB模型相同):
summary(
ZINB_GAD_uw_int <- zeroinfl(
dawbac_bl_GAD_sxs_uw ~ ZMean_winz + ZDis_winz + ZMean_winz*ZDis_winz + age_years + Nottingham_dummy + Dublin_dummy + Berlin_dummy + Hamburg_dummy + Mannheim_dummy + Paris_dummy + Dresden_dummy,
data = eurodata,
dist = "negbin",
model = TRUE,
y = TRUE, x = TRUE))
我在StackOverflow和其他论坛上也看到过其他有关此类问题的文章。据我所知,人们通常说这是一个问题,要么是1)共线预测变量,要么是2)模型太复杂,数据量太少。 (如果我误解了这一点,请告诉我!我对基于Poisson的模型还不是很陌生。)但是,我仍然对这些答案感到困惑,因为:1)在这种情况下,我的预测变量之间的相关性都不比。 15,除了感兴趣的主要预测变量(ZMean_winz
和ZDis_winz
)之外,它们的相关系数约为0.45。在其他有效的ZINB模型中使用了相同的预测变量。 2)有1206名参与者,并且使用相同的ZINB模型和其他疾病的相似计数数据运行,这让我有点困惑,因为对于我的数据来说,这可能太复杂了。
如果有人对为什么我的模型的该版本无法运行有任何解释,和/或有任何故障排除建议,我将不胜感激!如果需要,我也很乐意提供更多信息。
非常感谢您!
答案 0 :(得分:0)
model.matrix
是glm
,glm.nb
等内部调用的模型,用于对类别变量进行虚拟化。通常,这比手动对类别变量进行虚拟化更可取,并且应该这样做以避免错误并确保模型矩阵的完整等级(完整等级矩阵不是奇异的)。
您当然可以自己模拟类别变量;在那种情况下,我将使用model.matrix
将涉及分类变量(以及分类变量和其他变量之间可能的相互作用)的输入数据转换为正确的模型矩阵。
这里是一个例子:
set.seed(2017)
df <- data.frame(
DV = rnorm(100),
IV1_num = rnorm(100),
IV2_cat = sample(c("catA", "catB", "catC"), 100, replace = T))
head(df)
# DV IV1_num IV2_cat
#1 1.43420148 0.01745491 catC
#2 -0.07729196 1.37688667 catC
#3 0.73913723 -0.06869535 catC
#4 -1.75860473 0.84190898 catC
#5 -0.06982523 -0.96624056 catB
#6 0.45190553 -1.96971566 catC
mat <- model.matrix(DV ~ IV1_num + IV2_cat, data = df)
head(mat)
# (Intercept) IV1_num IV2_catcatB IV2_catcatC
#1 1 0.01745491 0 1
#2 1 1.37688667 0 1
#3 1 -0.06869535 0 1
#4 1 0.84190898 0 1
#5 1 -0.96624056 1 0
#6 1 -1.96971566 0 1
手动修改的输入数据将为
df.dummified = cbind.data.frame(DV = df$DV, mat[, -1])
# DV IV1_num IV2_catB IV2_catC
#1 1.43420148 0.01745491 0 1
#2 -0.07729196 1.37688667 0 1
#3 0.73913723 -0.06869535 0 1
#4 -1.75860473 0.84190898 0 1
#5 -0.06982523 -0.96624056 1 0
#6 0.45190553 -1.96971566 0 1
您将在其中使用的
glm.nb(DV ~ ., data = df.dummified)