我已经构建了一个for循环,用于对一组因变量和自变量进行anova测试。为了循环这些变量,它们都位于我的数据框main
中,我创建了两个具有因变量和自变量的向量(分别为DependentVariablesAnova
和IndependentVariablesAnova
)。
我还合并了粘贴函数,以便相应地命名结果测试。
for(i in 1:length(DependentVariablesAnova)){
for(j in 1:length(IndependentVariablesAnova)){
paste("Anova", c(DependentVariablesAnova[i]), c(IndependentVariablesAnova[j])) <- aov(c(DependentVariablesAnova[i]) ~ c(IndependentVariablesAnova[j]), data = main)
}
}
上述代码将导致以下错误消息:
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels
In addition: Warning message:
In storage.mode(v) <- "double" :
Show Traceback
Rerun with Debug
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels
我认为有一个相当简单的快速解决我的问题。如果不是这样,需要一个工作样品,请随时告诉我。
这是一种使用purrr
包中的map
的方法。
如果你愿意,你也可以在base R中使用apply
的相同方法,尽管这会使标记DVs变得有点困难。
library(tidyverse)
map_df(dvs, function(dv) {
map_df(ivs, function(iv) {
frm <- as.formula(paste(dv, "~", iv))
aov(frm, data = main) %>% broom::tidy(.)
})
}, .id = "dv")
输出# A tibble: 8 x 7
dv term df sumsq meansq statistic p.value
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 w x 2 1.53 0.764 0.827 0.440
2 w Residuals 97 89.6 0.923 NA NA
3 w z 2 3.54 1.77 1.96 0.146
4 w Residuals 97 87.5 0.903 NA NA
5 y x 2 5.49 2.74 3.13 0.0481
6 y Residuals 97 85.0 0.876 NA NA
7 y z 2 0.992 0.496 0.538 0.586
8 y Residuals 97 89.5 0.923 NA NA
数据:
n <- 100
main <- tibble(w = rnorm(n),
x = sample(letters[1:3], n, replace = TRUE) %>% as.factor,
y = rnorm(n),
z = sample(letters[4:6], n, replace = TRUE) %>% as.factor)
dvs <- c("w", "y") %>% set_names()
ivs <- c("x", "z")