我用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 系数与对数系数联系起来?
我在互联网上找到的所有内容以及我在来到stackoverflow之前搜索的文档都是这个注释:
glm 系数表的工作方式与方差分析的摘要类似 由 LM 制作:按字母顺序排列的级别 (S2,W0.5( 用作 拦截,所有后续级别都针对第一个级别进行测试 (因此,其余系数是与平均值的差值,而不是 指他们自己(。
但是,对我来说,这还不足以理解如何以loglm的形式从glm输出中获取系数。现在,您的问题可能是:"为什么不直接使用 loglm?Loglm 在我的情况下不起作用,(这不是我在这里比较的那个,但它有一个带有一些零的 5 维表。因此,如果我在原始表上使用 loglm,它会给我所有系数作为 NaNS(。所以我被困在 glm 上,我真的很想像对数一样获得系数。
多谢!
您似乎有一个双向交叉表,其中包含 10 个因子 w
水平和 5 个因子s
水平,模型中没有交互作用。对于glm()
,分类变量的默认编码方案是处理编码,其中因子中的第一组是参考水平,其余每个组的相应参数是它与该参考的差值。(Intercept)
估计值适用于具有所有组 = 其因子的参考水平的像元。
对于loglm()
,参数用于偏差编码,这意味着每个组都有自己的参数,并且一个因子的参数总和为零。 (Intercept)
是添加到所有组效应中的大平均值。
在您的示例中,您可以告诉glm()
使用偏差编码来获取与loglm()
相同的参数估计值(请参阅下面的示例(,或者从处理编码转换参数估计值,如下所示:
- 且
s
= 2 是参考单元格:glm()
9.5104005 =loglm()
10.18939 + -1.04596513 + 0.36697307 - 且
s
= 2 是s
的参考水平,但需要从w
= 0.1 到参考w
= 0.05 的差值:glm()
9.5104005 + 0.6340290 =loglm()
10.18939 + -0.41193617 + 0.36697307 - 但需要从
w
= 0.1 到参考w
= 0.05 的差值,以及从s
= 3 到参考s
= 2 的差值:glm()
9.5104005 + 0.6340290 + -0.2153295 =loglm()
10.18939 + -0.41193617 + 0.15164360,依此类推
w
= 0.05 w
= 0.1 w
= 0.1 和 s
= 3,使用偏差编码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()
不会列出那些通过一个因子的参数的总和到零约束完全确定(别名(的参数估计值。