在 R 中,如何自动分析每个处理的统计检验(即方差分析),而无需手动指定每个处理?

问题描述 投票:0回答:2

比如我有以下数据

Cultivar=rep(c("CV1","CV2"),each=12)
Nitrogen=rep(rep(c("N0","N1","N2","N3"), each=3),2)
Block=rep(c("I","II","III"),8)
Yield=c (99, 109, 89, 115, 142, 133, 121, 157, 142, 125, 
         150, 139, 82, 104, 99, 117, 125, 127, 145, 154, 
         154, 151, 166, 175)
dataA=data.frame(Cultivar,Nitrogen,Block,Yield)

   Cultivar Nitrogen  Block  Yield
1  CV1       N0       I      99
2  CV1       N0       II     109
3  CV1       N0       III    89
4  CV1       N1       I      115
5  CV1       N1       II     142
6  CV1       N1       III    133
7  CV1       N2       I      121
8  CV1       N2       II     157
9  CV1       N2       III    142
10 CV1       N3       I      125
11 CV1       N3       II     150
12 CV1       N3       III    139
13 CV2       N0       I      82
14 CV2       N0       II     104
15 CV2       N0       III    99
16 CV2       N1       I      117
17 CV2       N1       II     125
18 CV2       N1       III    127
19 CV2       N2       I      145
20 CV2       N2       II     154
21 CV2       N2       III    154
22 CV2       N3       I      151
23 CV2       N3       II     166
24 CV2       N3       III    175

我想对每个品种做方差分析。所以,我使用下面的代码:

ANOVA=aov(Yield~Nitrogen +factor(Block), data=subset(dataA, Cultivar=="CV1"))
summary(ANOVA)

貌似还可以,但是在我的实际数据中,我有30个品种,所以人工按品种分30次数据是不行的。我相信有一种方法可以自动分析每个品种的数据,而无需在 R.

 中使用
subset()

你能告诉我怎么做吗?

谢谢!

r subset anova
2个回答
1
投票

你可以做

lapply()

treatment = unique(dataA$Cultivar)
lapply(treatment, \(x){
  ANOVA=aov(Yield~Nitrogen +factor(Block), dataA[dataA$Cultivar == x,])
  summary(ANOVA)
}) |> 
  setNames(treatment)

输出

$CV1
              Df Sum Sq Mean Sq F value  Pr(>F)   
Nitrogen       3   3248  1082.7   19.14 0.00179 **
factor(Block)  2   1206   603.2   10.66 0.01059 * 
Residuals      6    340    56.6                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

$CV2
              Df Sum Sq Mean Sq F value  Pr(>F)    
Nitrogen       3   8486  2828.7  136.88 6.5e-06 ***
factor(Block)  2    546   273.0   13.21 0.00634 ** 
Residuals      6    124    20.7                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

0
投票

为了让 YH 的答案更进一步,这类问题非常适合拆分、应用、合并方法。

splitdata <- split(dataA, dataA$Cultivar)

lapply(splitdata, function(df) {
   ANOVA=aov(Yield~Nitrogen +factor(Block), data=df)
   summary(ANOVA)
})
© www.soinside.com 2019 - 2024. All rights reserved.