3

我用对数线性模型拟合了一个 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) 用作截距,所有后续级别都针对第一个级别进行测试(因此其余系数与意思,不是指自己)。

不过,对我来说,这还不足以理解如何以 loglm 的形式从 glm 输出中获取系数。现在,您的问题可能是:“为什么不直接使用 loglm?” Loglm 在我的情况下不起作用,(这不是我在这里比较的,但它有一个带有一些零的 5 维表。所以如果我在原始表上使用 loglm,它会给我所有的系数作为 NaN)。所以我被 glm 困住了,我真的很想得到 loglm 中的系数。

非常感谢!

4

1 回答 1

4

您似乎有一个双向交叉表,其中包含 10 个因子w水平和 5 个因子水平,s模型中没有交互作用。使用glm()时,分类变量的默认编码方案是处理编码,其中因子中的第一组是参考水平,每个剩余组的相应参数是其与该参考的差异。估计值适用于所有组的(Intercept)单元格 = 其因子的参考水平。

loglm()参数用于偏差编码,意味着每个组都有自己的参数,并且一个因素的参数总和为零。(Intercept)是添加到所有组效应中的总平均值。

在您的示例中,您可以告诉glm()使用偏差编码来获得与使用相同的参数估计值loglm()(参见下面的示例),或者您将参数估计值从处理编码转换如下:

  • 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,依此类推

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()没有列出那些通过对一个因素的参数的总和为零约束完全确定(混叠)的参数估计。

于 2014-04-23T19:40:04.497 回答