2012-06-27 61 views
9

如果我在R中有一個線性模型的彙總表,我怎樣才能得到與相互作用估計值相關聯的p值,或者僅僅是羣組截取值等,而不必計算行號?在R線性模型中,僅爲相互作用係數獲得p值

例如,與這樣的模型如lm(y ~ x + group)x如連續和group作爲分類,對於lm對象彙總表具有用於估算值:

  1. 截距
  2. X,所有的斜率組
  3. 5組內差異從整體截距
  4. 5組內差異總體斜率。

我想找出一種方法,即使組數或模型公式發生變化,也可以將這些值作爲一組p值來獲得。也許有彙總表以某種方式用於將行組合在一起的信息?

以下是兩個不同型號的示例數據集。第一個模型有四組不同的p值,我可能想單獨獲得,而第二個模型只有兩組p值。

x <- 1:100 
groupA <- .5*x + 10 + rnorm(length(x), 0, 1) 
groupB <- .5*x + 20 + rnorm(length(x), 0, 1) 
groupC <- .5*x + 30 + rnorm(length(x), 0, 1) 
groupD <- .5*x + 40 + rnorm(length(x), 0, 1) 
groupE <- .5*x + 50 + rnorm(length(x), 0, 1) 
groupF <- .5*x + 60 + rnorm(length(x), 0, 1) 

myData <- data.frame(x = x, 
    y = c(groupA, groupB, groupC, groupD, groupE, groupF), 
    group = rep(c("A","B","C","D","E","F"), each = length(x)) 
) 

myMod1 <- lm(y ~ x + group + x:group, data = myData) 
myMod2 <- lm(y ~ group + x:group - 1, data = myData) 
summary(myMod1) 
summary(myMod2) 

回答

15

您可以通過summary()$coefficients訪問所有係數及其相關統計,像這樣:

> summary(myMod1)$coefficients 
       Estimate Std. Error  t value  Pr(>|t|) 
(Intercept) 9.8598180335 0.207551769 47.50534335 1.882690e-203 
x   0.5013049448 0.003568152 140.49427911 0.000000e+00 
groupB  9.9833257879 0.293522526 34.01212819 5.343527e-141 
groupC  20.0988336744 0.293522526 68.47458673 2.308586e-282 
groupD  30.0671851583 0.293522526 102.43569906 0.000000e+00 
groupE  39.8366758058 0.293522526 135.71931370 0.000000e+00 
groupF  50.4780382104 0.293522526 171.97330259 0.000000e+00 
x:groupB -0.0001115097 0.005046129 -0.02209807 9.823772e-01 
x:groupC  0.0004144536 0.005046129 0.08213297 9.345689e-01 
x:groupD  0.0022577223 0.005046129 0.44741668 6.547390e-01 
x:groupE  0.0024544207 0.005046129 0.48639675 6.268671e-01 
x:groupF -0.0052089956 0.005046129 -1.03227556 3.023674e-01 

如此,你只希望p值,即第4列:

> summary(myMod1)$coefficients[,4] 
    (Intercept)    x  groupB  groupC  groupD  groupE  groupF  x:groupB  x:groupC 
1.882690e-203 0.000000e+00 5.343527e-141 2.308586e-282 0.000000e+00 0.000000e+00 0.000000e+00 9.823772e-01 9.345689e-01 
    x:groupD  x:groupE  x:groupF 
6.547390e-01 6.268671e-01 3.023674e-01 

最後,您只需要特定係數的p值,無論是截取值還是交互項。這樣做的一種方式是通過grepl()以匹配係數名稱(names(summary(myMod1)$coefficients[,4]))至一個正則表達式和使用邏輯向量grepl返回作爲索引:

> # all group dummies 
> summary(myMod1)$coefficients[grepl('^group[A-F]',names(summary(myMod1)$coefficients[,4])),4] 
     groupB  groupC  groupD  groupE  groupF 
5.343527e-141 2.308586e-282 0.000000e+00 0.000000e+00 0.000000e+00 
> # all interaction terms 
> summary(myMod1)$coefficients[grepl('^x:group[A-F]',names(summary(myMod1)$coefficients[,4])),4] 
x:groupB x:groupC x:groupD x:groupE x:groupF 
0.9823772 0.9345689 0.6547390 0.6268671 0.3023674 
+0

謝謝,這是一個很好的方法來做到這一點。請注意,如果我使用與默認值不同的對比度,則行名稱爲group1,group2,group3等,而不是groupA,groupB,groupC等。如果它們是不依賴於其他方法的附加方法瞭解組級別名稱和正在使用的對比。 – Jdub

+0

我不確定我是否正確理解你。如果你想讓它工作而不考慮因素級別的名稱,你可以嘗試類似於%paste0('group(%)')的%summary(myMod1)$ coefficients [names(summary(myMod1)$ coefficients [,4])% ' ',levels(myData $ group)),4]' – RoyalTS

+0

如果這回答你的問題,你會好好接受它(點擊答案旁邊的綠色複選標記)? – RoyalTS

4

有現在broom封裝來處理的統計函數輸出。在這種情況下,其tidy()功能:

library(broom) 
tidy(myMod1) 

      term  estimate std.error statistic  p.value 
1 (Intercept) 10.0379389850 0.19497112 51.4842342 5.143448e-220 
2   x 0.5009946732 0.00335187 149.4672019 0.000000e+00 
3  groupB 9.8949134549 0.27573081 35.8861368 3.002513e-150 
4  groupC 19.8437942091 0.27573081 71.9679981 1.021613e-293 
5  groupD 29.9055587100 0.27573081 108.4592579 0.000000e+00 
6  groupE 39.7258414666 0.27573081 144.0747296 0.000000e+00 
7  groupF 50.1210013973 0.27573081 181.7751231 0.000000e+00 
8  x:groupB -0.0005319302 0.00474026 -0.1122154 9.106909e-01 
9  x:groupC -0.0010145553 0.00474026 -0.2140294 8.305983e-01 
10 x:groupD -0.0025544113 0.00474026 -0.5388757 5.901766e-01 
11 x:groupE 0.0045780202 0.00474026 0.9657740 3.345543e-01 
12 x:groupF -0.0058636354 0.00474026 -1.2369859 2.165861e-01 

結果是一個data.frame,讓您可以輕鬆的交互項過濾器(其名稱中包含一個冒號):

pvals <- tidy(myMod1)[, c(1,5)] 
pvals[grepl(":", pvals$term), ] 

     term p.value 
8 x:groupB 0.9106909 
9 x:groupC 0.8305983 
10 x:groupD 0.5901766 
11 x:groupE 0.3345543 
12 x:groupF 0.2165861 

broomdplyr包配合良好;例如,提取非交互式組係數:

library(dplyr) 
tidy(myMod1) %>% 
    select(term, p.value) %>% 
    filter(! grepl(":", term), term != "(Intercept)", term != "x") 

    term  p.value 
1 groupB 3.002513e-150 
2 groupC 1.021613e-293 
3 groupD 0.000000e+00 
4 groupE 0.000000e+00 
5 groupF 0.000000e+00 
相關問題