使用ldply()从GLM模型列表中提取偏差

时间:2013-01-25 15:38:27

标签: r statistics extract plyr graph-modelling-language

我想使用ldply()

从GLM模型列表中提取偏差

示例数据(来自R base安装):

    library(reshape2)
    library(plyr)
    mtcars.1 <- mtcars[, c("am",  "qsec" , "drat")  ]
    mtcars.m <- melt(mtcars.1, id= 1 ) 

    glm.cars <- dlply( mtcars.m ,  .(variable) ,  
    glm,  formula=  am ~ value , family=binomial )  

到目前为止:

    ldply(  glm.cars  ,  summarise ,   "Null Deviance" = null.deviance , 
        "Residual Deviance" = deviance , "Deviance"= "??"    )

由此提供:

      variable  Null Deviance     Residual Deviance    Deviance
1     qsec      43.22973          41.46512             ??
2     drat      43.22973          21.65003             ??

缺少偏差!我该如何提取它?

那么如何在上面的例子中提取偏差?

当然我可以做null.deviance + deviance,但我不想那样做。我想我想要更好地了解G统计数据的原因。我觉得我经历了提取,减去和做chisqr的困难,我会更好地学习它。

PS我很困惑,发现glm.model $ devianc

1 个答案:

答案 0 :(得分:3)

正如你所说,你很困惑。对于每个型号,您有两个偏差。这两个偏差(......不是它们的总和)的区别在于有趣的统计测量。 (我猜你正在对剩余平方和和模型平方和的加性特性进行类比,但如果是这样的话,那么你就跟着错误的兔子沿着语言类比洞走了。)你需要将差异与a进行比较。具有与零模型和“残差模型”之间的自由度差异相同的自由度的95%卡方值。如果在模型上执行str(。),则可以向下滚动列表输出以查找以下内容:

 str(glm(am~qsec, mtcars, family=binomial)  )
 .....
 $ deviance         : num 41.5
 $ aic              : num 45.5
 $ null.deviance    : num 43.2
 .....
 $ df.residual      : int 30
 $ df.null          : int 31
 .....

因此,您的dlply代码需要提取这些代码,然后您计算null.deviance-deviancedf.null -df.residual,并可能会显示qchisq(0.95, df.null-df.residual)。如果你想看看如何通过R-Core打包它,那么看看:

 anova( glm(am~qsec, mtcars, family=binomial)  )