glm 中的系数与 loglm 中的系数有何不同?

3

我用loglm和glm两个模型分别对一个三维列联表进行了拟合,这里没有提供该表格,如果需要的话我可以提供。我得到的系数结果如下:

> coefficients(nodnox_loglm_model)
$`(Intercept)`
[1] 10.18939

$w
       0.05         0.1        0.15         0.2        0.25         0.3        0.35         0.4        0.45 
-1.04596513 -0.41193617 -0.08840858  0.06407334 -0.06862606  0.02999039  0.17084795  0.45838071  0.35307375 
        0.5 
 0.53856982 

$s
          2           3           4           5 
 0.36697307  0.15164360 -0.48264571 -0.03597096 

并且

> coefficients(nodnox_glm_model)
(Intercept)          s3          s4          s5        w0.1       w0.15        w0.2       w0.25        w0.3 
  9.5104005  -0.2153295  -0.8496188  -0.4029440   0.6340290   0.9575566   1.1100385   0.9773391   1.0759555 
      w0.35        w0.4       w0.45        w0.5 
  1.2168131   1.5043458   1.3990389   1.5845350 

我知道这两种方法有不同的数值程序 - 我不关心那个 - 我想知道的是如何将glm系数与loglm系数联系起来?
我在互联网上和来到stackoverflow之前搜索的所有文档中都只找到了这个注释:
glm系数表的工作方式就像lm生成的ANOVA摘要一样:按字母顺序第一个级别(s2,w0.5)用作截距,并且所有后续级别都针对第一个进行测试(因此其余系数是与平均值的差异,而不是平均值本身)。
然而,对我来说,这还不足以理解如何从glm输出中以loglm形式获得系数。现在,您的问题可能是:“为什么不直接使用loglm?” 在我的情况下,loglm行不通(虽然这不是我在这里比较的情况,但它具有一张带有一些零的5维表。因此,如果我在原始表上使用loglm,则会将所有系数作为NaN给出)。因此,我被困在glm上,我真的想以loglm的形式获得系数。
非常感谢!
1个回答

4
看起来你有一个两个因子交叉表格,w 有10个水平,s 有5个水平,并且在模型中没有相互作用。使用 glm() 函数处理分类变量的默认编码方式是treatment coding,其中每个因子中的第一组是参考水平,每个剩余组的相应参数是它们与此参考水平之间的差异。 (Intercept) 估计值是所有组都等于其因子的参考水平的单元格的值。
使用 loglm(),参数是偏差编码,这意味着每个组都有自己的参数,并且一个因子的参数总和为零。 (Intercept) 是全部组效应添加而得到的平均值。
在您的示例中,您可以告诉 glm() 使用偏差编码以获得与 loglm() 相同的参数估计值(请参见下面的示例),或按照以下方式将参数估计值从 treatment coding 转换为 deviation coding:
- w = 0.05 和 s = 2 是参考单元格: glm() 9.5104005 = loglm() 10.18939 + -1.04596513 + 0.36697307 - w = 0.1 和 s = 2 是 s 的参考水平,但需要计算从 w = 0.1 到参考水平 w = 0.05 的差异: glm() 9.5104005 + 0.6340290 = loglm() 10.18939 + -0.41193617 + 0.36697307 - w = 0.1 和 s = 3 需要计算从 w = 0.1 到参考水平 w = 0.05 和从 s = 3 到参考水平 s = 2 的差异: glm() 9.5104005 + 0.6340290 + -0.2153295 = loglm() 10.18939 + -0.41193617 + 0.15164360,以此类推。
下面是使用 deviation coding 的 glm() 函数的示例(UCBAdmissions 是一个带有绝对频率的交叉表,内置于基本 R):
> library(MASS)                                # for loglm()
> llmFit <- loglm(~ Admit + Gender + Dept, data=UCBAdmissions)
> coef(llmFit)
$`(Intercept)`
[1] 5.177567

$Admit
  Admitted   Rejected 
-0.2283697  0.2283697 

$Gender
      Male     Female 
 0.1914342 -0.1914342 

$Dept
          A           B           C           D           E           F 
 0.23047857 -0.23631478  0.21427076  0.06663476 -0.23802565 -0.03704367 

> UCBdf <- as.data.frame(UCBAdmissions)  # convert to data frame for glm()
> glmFit <- glm(Freq ~ Admit + Gender + Dept, family=poisson(link="log"),
+               contrasts=list(Admit=contr.sum, Gender=contr.sum, Dept=contr.sum),
+               data=UCBdf)
> coef(glmFit)
(Intercept)      Admit1     Gender1       Dept1       Dept2       Dept3       Dept4 
 5.17756677 -0.22836970  0.19143420  0.23047857 -0.23631478  0.21427076  0.06663476 
      Dept5 
-0.23802565 

请注意,glm()没有列出那些通过参数对于一个因素的零和约束完全确定(合并)的参数估计。

我如何获得完全由“和为零”约束条件确定的参数估计?也就是说,如果我理解正确,参考类别的估计值是多少? - maycca
@maycca 不太美观(系数名称缺失),但这个可以工作:
ce <- coef(glmFit)[-1]; cen <- gsub("(.+)[[:digit:]]+$", "\\1", names(ce)); tapply(ce, cen, function(x) { c(x, -sum(x)) })
这类似于上面的 coef(llmFit),但可以推广到置信区间。
- caracal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接