2013-09-25 46 views
3

我用對數線性模型(loglm和glm)擬合3維列聯表(這裏沒有提供,但我可以,如果可以的話)。 這兩個結果我在係數方面得到的是:glm中的係數與loglm中的係數

> 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的係數表的工作原理就像摘要ANOVA 通過LM產生:水平按字母順序排列第一( s2,w0.5)被用作截距,並且所有後續水平針對第一個 進行測試(因此其餘係數與平均值不同,而不是 意味着它們自己)。

對我來說,這並不足以理解如何以loglm的形式從glm輸出中獲得係數。 現在,您的問題可能是:「爲什麼不直接使用loglm?」 Loglm在我的情況下不起作用(這不是我在這裏比較的那個,但它有一個帶有零點的5維表格,所以如果我在原表格上使用loglm,它會給我所有的係數作爲NaNs) 。所以我被glm卡住了,我真的想要得到像loglm中的係數。

非常感謝!

回答

4

看來你有一個雙向交叉表,有10個因子w的等級和5個因子s的等級,在模型中沒有相互作用。對於glm(),分類變量的默認編碼方案是treatment coding,其中第一個因子組是參考等級,並且每個剩餘組的相應參數是其與該參考的差異。 (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但需要從的差= 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()沒有列出的那些參數ES通過對一個因子的參數求和到零約束完全確定(別名)的時差。