在R中一行包含完整模型的Anova表

9udxz4iz  于 2023-07-31  发布在  其他
关注(0)|答案(4)|浏览(82)

我在R中拟合一个线性模型,其中有三个变量,如下所示

cube_mod <- lm(y ~ x + x_2 + x_3)

字符串
然后使用anova函数显示方差分析的结果,并得到下表

anova(cube_mod)
Analysis of Variance Table

Response: y
          Df Sum Sq Mean Sq  F value   Pr(>F)    
x          1     21      21   0.0083 0.928881    
x_2        1 658209  658209 254.2771 2.26e-10 ***
x_3        1  64967   64967  25.0977 0.000191 ***
Residuals 14  36240    2589                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

该表分别显示了每个变量的F检验,但我希望下表仅显示完整模型的F检验。

Analysis of Variance Table

Response: y
          Df Sum Sq Mean Sq  F value   Pr(>F)    
Model      3 723197  241066    93.13        0 
Residuals 14  36240    2589                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


有没有一种简单的方法可以从线性模型对象中得到这个表?

5gfr0r5j

5gfr0r5j1#

**1)**使用内置的anscombe data.frame

Model <- as.matrix(anscombe[6:8])
anova(lm(y1 ~ Model, anscombe))

字符串
给出:

Analysis of Variance Table

Response: y1
          Df Sum Sq Mean Sq F value  Pr(>F)  
Model      3 24.285  8.0948  3.3355 0.08577 .
Residuals  7 16.988  2.4269                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

**2)**或lm对象fm,如注解中所讨论的

fm <- lm(y1 ~ y2 + y3 + y4, anscombe)

Model <- model.matrix(fm)
anova(update(fm, . ~ Model))
# same output as above

**3)**另一种方法是从sasLM中获取aov1:

library(sasLM)
aov1(y1 ~ y2 + y3 + y4, anscombe)[c(1, 5), ]
##           Df   Sum Sq  Mean Sq  F value     Pr(>F)
## MODEL      3 24.28449 8.094828 3.335479 0.08576858
## RESIDUALS  7 16.98821 2.426887       NA         NA

更新

增加了使用fm的方法,将其简化了一点,并将模型切换为使用y2,y3和y4作为自变量,因为x1,x2和x3在anscombe中都是相同的。还添加了使用sasLM包的解决方案。

anscombe
##    x1 x2 x3 x4    y1   y2    y3    y4
## 1  10 10 10  8  8.04 9.14  7.46  6.58
## 2   8  8  8  8  6.95 8.14  6.77  5.76
## 3  13 13 13  8  7.58 8.74 12.74  7.71
## 4   9  9  9  8  8.81 8.77  7.11  8.84
## 5  11 11 11  8  8.33 9.26  7.81  8.47
## 6  14 14 14  8  9.96 8.10  8.84  7.04
## 7   6  6  6  8  7.24 6.13  6.08  5.25
## 8   4  4  4 19  4.26 3.10  5.39 12.50
## 9  12 12 12  8 10.84 9.13  8.15  5.56
## 10  7  7  7  8  4.82 7.26  6.42  7.91
## 11  5  5  5  8  5.68 4.74  5.73  6.89

g6baxovj

g6baxovj2#

我在@G.Grothendieck的回答中使用了示例数据。
您可以将该模型与anova()中的仅拦截空模型进行比较。

Model <- lm(y1 ~ y2 + y3 + y4, anscombe)
anova(update(Model, . ~ 1), Model)

# Analysis of Variance Table
# 
# Model 1: y1 ~ 1
# Model 2: y1 ~ y2 + y3 + y4
#   Res.Df    RSS Df Sum of Sq      F  Pr(>F)  
# 1     10 41.273                              
# 2      7 16.988  3    24.285 3.3355 0.08577 .

字符串
它显示了与summary(Model)anova(Model)相同的F检验统计量。

summary(Model)
# ...skip
# F-statistic: 3.335 on 3 and 7 DF,  p-value: 0.08577

anova(Model)
# Response: y1
#           Df  Sum Sq Mean Sq F value  Pr(>F)  
# y2         1 23.2162 23.2162  9.5663 0.01749 *
# y3         1  0.0487  0.0487  0.0200 0.89139  
# y4         1  1.0196  1.0196  0.4201 0.53755  
# Residuals  7 16.9882  2.4269

pqwbnv8z

pqwbnv8z3#

尝试Rsupernova中的supernova函数,类似于

library(supernova)
supernova(lm(mpg ~ disp + cyl, data = mtcars))
Analysis of Variance Table (Type III SS)
 Model: mpg ~ disp + cyl

                               SS df      MS      F   PRE     p
 ----- --------------- | -------- -- ------- ------ ----- -----
 Model (error reduced) |  855.307  2 427.653 45.808 .7596 .0000
  disp                 |   37.594  1  37.594  4.027 .1219 .0542
   cyl                 |   46.418  1  46.418  4.972 .1464 .0337
 Error (from model)    |  270.740 29   9.336                   
 ----- --------------- | -------- -- ------- ------ ----- -----
 Total (empty model)   | 1126.047 31  36.324

字符串

abithluo

abithluo4#

您可以手动计算:

fit <- lm(mpg ~ wt + qsec+as.factor(cyl), mtcars)
temp <- anova(fit)

out <- temp
n <- nrow(temp)
out$Df <- with(temp,c(sum(Df[1:(n-1)]),Df[n],rep(NA_real_,n-2)))
out$`Sum Sq` <- with(temp,c(sum(`Sum Sq`[1:(n-1)]),`Sum Sq`[n],rep(NA_real_,n-2)))
out$`Mean Sq` <- with(out,out$`Sum Sq`/out$Df)
out$`F value` <- c(out$`Mean Sq`[1]/out$`Mean Sq`[2],rep(NA_real_,n-1))
out$`Pr(>F)` <- c(pf(out$`F value`[1],out$Df[1],out$Df[2],lower.tail = FALSE),rep(NA_real_,n-1))
out <- out[1:2,]
rownames(out) <- c("Model","Residuals")
out

Analysis of Variance Table

Response: mpg
          Df Sum Sq Mean Sq F value    Pr(>F)    
Model      4 953.94 238.484  37.413 1.208e-10 ***
Residuals 27 172.11   6.374                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

字符串

相关问题