【问题标题】:How to change na.action for zero-inflated regression model?如何更改零膨胀回归模型的 na.action?
【发布时间】:2013-04-28 21:33:02
【问题描述】:

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

我需要从模型中排除 NA,以便能够在稍后的分析中针对因变量绘制残差。

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

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 吗?

【问题讨论】:

    标签: r plot na missing-data


    【解决方案1】:

    通过跟踪从zeroinflglm.fit 的文档发现:“‘工厂新鲜’默认值为na.omit。”请注意,我没有在它周围加上引号,因为它应该是一个函数,但该函数将接受它作为名称,因此是否引用它并不重要。我承认我真的不知道na.omitna.exclude 有什么不同(与我阅读的残差有关),但肯定会首先使用默认设置,因为它通常提供我想要的回归函数.所以试着把它排除在外:

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

    【讨论】:

    • 不幸的是,只留下 na.exclude 对我来说不起作用。正如在 ?na.exclude 中发现的:“na.exclude 与 na.omit 的不同之处仅在于结果的“na.action”属性的类,即“exclude”。这在使用 naresid 和napredict:当使用 na.exclude 时,通过为 na.exclude 省略的情况插入 NA,将残差和预测填充到正确的长度。” -- 这就是为什么在我的情况下使用 na.exclude 而不是 na.omit 至关重要。
    • 如果您提供na.omit(df) 作为数据参数,该函数不应看到任何 NA。
    • 不幸的是,在 data 参数中使用 na.omit(df) 只会产生与使用 na.action="na.exclude" 相同的错误。
    【解决方案2】:

    由于使用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)
    

    【讨论】:

    • 然而,不幸的是,我们需要为每个想要运行的新回归模型重复定义一个新数据集的过程,这在使用许多不同的回归模型时会变得很麻烦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2016-09-04
    相关资源
    最近更新 更多