如何改变零膨胀回归模型的na.action?

时间:2013-05-04 16:34:53

标签: r plot na missing-data

我使用zeroinfl包中的函数pscl运行零膨胀负二项回归模型。

我需要从模型中排除NA,以便能够在分析后期对依赖变量绘制残差。

因此,我想设置na.action="na.exclude"。对于非零膨胀的负二项回归模型(使用glm.nb包中的glm),我可以毫无问题地执行此操作,例如。

fm_nbin <- glm.nb(DV ~ factor(IDV) + contr1
               +contr2 + contr3, data=df, 
               subset=(df$var<500), na.action="na.exclude")
fm_nbin.res = resid(fm_nbin) 
plot(fm_nbin.res~df$var)  

工作正常。但是,当我对零膨胀模型执行相同操作时,它不起作用:

zinfl <- zeroinfl(DV ~ factor(IDV) + contr1
               +contr2 + contr3 | factor(IDV) + contr1
               +contr2 + contr3, data=df, 
               subset=(df$var<500), na.action="na.exclude")
zinfl.res = resid(zinfl) 
plot(zinfl.res~df$var)

给出错误

Error in function (formula, data = NULL, subset = NULL, na.action = na.fail,  : 
  variable lengths differ (found for 'df$var')

我应该使用其他命令将NA从我的回归中排除吗?

编辑: This是我能找到的答案中最接近的答案。它能以某种方式应用于我的问题吗? 另外,可以以某种方式应用naresid吗?

2 个答案:

答案 0 :(得分:1)

正如通过跟踪zeroinflglm.fit的文档记录所发现的那样:“'factory-fresh'默认值为na.omit。”请注意,我没有在它周围加上引号,因为它应该是一个函数而不是函数将接受它作为一个名称所以如果它被引用并不重要。我承认我真的不知道na.omitna.exclude真的有什么不同(与我读到的残差有关),但肯定会先使用默认设置,因为它通常会提供我的内容想要回归函数。所以试着把它留下来:

zinfl <- zeroinfl(DV ~ factor(IDV) + contr1
           +contr2 + contr3 | factor(IDV) + contr1
           +contr2 + contr3, data=df, 
           subset=(df$var<500) )

答案 1 :(得分:0)

由于使用na.omit(df)na.action="na.exclude"的选项似乎都不适用于zeroinfl回归模型,因此我找到了实现NA的另一种(间接)方式在回归中被排除在外。

首先,由于我的原始数据集包含的变量远远多于回归量和结果变量,因此我创建了一个新的数据集,其中仅包含我在回归模型中使用的变量;并设置var值的条件,以包括回归中的观察结果:

df1 <- subset(df, var<500, select=c("DV", "IDV", "contr1", "contr2", "contr3"))
df1 <- na.omit(df1)

然后我使用新的数据集df1运行与上面相同的代码,它完美地运行:

zinfl <- zeroinfl(DV ~ factor(IDV) + contr1
           +contr2 + contr3 | factor(IDV) + contr1
           +contr2 + contr3, data=df1)
zinfl.res = resid(zinfl) 
plot(zinfl.res~df1$DV)