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

6mzjoqzu  于 2023-05-04  发布在  R语言
关注(0)|答案(2)|浏览(109)

例如,我有以下数据。

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()
你能告诉我怎么做吗?
谢谢!

nhaq1z21

nhaq1z211#

可以使用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
j1dl9f46

j1dl9f462#

为了进一步理解YH的答案,这种类型的问题很适合使用拆分、应用、合并方法。

#split into a list of data frames by Cultivar column
splitdata <- split(dataA, dataA$Cultivar)

#apply the Anova function to the list of data frames
lapply(splitdata, function(df) {
   ANOVA=aov(Yield~Nitrogen +factor(Block), data=df)
   summary(ANOVA)
})

相关问题