R中的零膨胀负二项式模型:计算奇异

时间:2018-07-22 21:46:58

标签: r poisson

我一直在比较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_winzZDis_winz)之外,它们的相关系数约为0.45。在其他有效的ZINB模型中使用了相同的预测变量。 2)有1206名参与者,并且使用相同的ZINB模型和其他疾病的相似计数数据运行,这让我有点困惑,因为对于我的数据来说,这可能太复杂了。

如果有人对为什么我的模型的该版本无法运行有任何解释,和/或有任何故障排除建议,我将不胜感激!如果需要,我也很乐意提供更多信息。

非常感谢您!

1 个答案:

答案 0 :(得分:0)

model.matrixglmglm.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)