【问题标题】:Iterating one-way ANOVA through loop throws error in R通过循环迭代单向方差分析会在 R 中引发错误
【发布时间】:2019-10-26 22:27:03
【问题描述】:

我正在尝试遍历一个大型数据框 [5413 列] 并在每一列上运行 ANOVA,但是在尝试这样做时出现错误。

我想将方差分析中的 P 值写入包含列标题的数据框中的新行。但是限制了我目前的知识,我将 P 值输出写入可以在 bash 中解析的文件。

以下是数据布局示例:

data()
Name, Group, aaaA, aaaE, bbbR, cccD
Apple, Fruit, 1.23, 0.45, 0.3, 1.1
Banana, Fruit, 0.54, 0.12, 2.0, 1.32
Carrot, Vegetable, 0.01, 0.05, 0.45, 0.9
Pear, Fruit, 0.1, 0.2, 0.1, 0.3
Fox, Animal, 1.0, 0.9, 1.2, 0.8
Dog, Animal, 1.2, 1.1, 0.8, 0.7

这是 dput 的输出:

structure(list(Name = structure(c(1L, 2L, 3L, 6L, 5L, 4L), .Label = c("Apple", 
"Banana", "Carrot", "Dog", "Fox", "Pear"), class = "factor"), 
    Group = structure(c(2L, 2L, 3L, 2L, 1L, 1L), .Label = c(" Animal", 
    " Fruit", " Vegetable"), class = "factor"), aaaA = c(1.23, 
    0.54, 0.01, 0.1, 1, 1.2), aaaE = c(0.45, 0.12, 0.05, 0.2, 
    0.9, 1.1), bbbR = c(0.3, 2, 0.45, 0.1, 1.2, 0.8), cccD = c(1.1, 
    1.32, 0.9, 0.3, 0.8, 0.7)), class = "data.frame", row.names = c(NA, 
-6L))

要从我做的一个成功的输出:

summary(aov(aaaA ~ Group, data=data))[[1]][["Pr(>F)"]]

然后我尝试在循环中实现它:

for(i in names(data[3:6])){
out <- summary(aov(i ~ Group, data=data))[[1]][["Pr(>F)"]]
write.csv(out, i)}

返回错误:

Error in model.frame.default(formula = i ~ Group, data = test, drop.unused.levels = TRUE) : 
variable lengths differ (found for 'Group')

任何人都可以帮助解决错误或实施每列方差分析吗?

【问题讨论】:

  • 请与dput(my_data)分享您的数据。
  • @NelsonGon 我已经用示例数据集编辑了帖子,谢谢!
  • cccDintentionally NAs 吗?
  • 抱歉,其中一行结尾有逗号。现已修复。
  • 这对你有用吗?有点乱:lapply(to_use,function(x) do.call(aov,list(as.formula(paste("aaaA","~",x)), data=df)))to_use&lt;-setdiff(names(df),"aaaA") 很乱,因为它返回一些乱七八糟的源代码。

标签: r anova


【解决方案1】:

我们可以执行以下操作,然后获取 p 值:

to_use<-setdiff(names(df),"aaaA")
lapply(to_use,function(x) summary(do.call(aov,list(as.formula(paste("aaaA","~",x)),
                                           data=df))))

这给了你:

[[1]]
            Df Sum Sq Mean Sq
Name         5   1.48   0.296

[[2]]
            Df Sum Sq Mean Sq F value Pr(>F)
Group        2 0.8113  0.4057   1.819  0.304
Residuals    3 0.6689  0.2230               

[[3]]
            Df Sum Sq Mean Sq F value Pr(>F)  
aaaE         1 0.9286  0.9286   6.733 0.0604 .
Residuals    4 0.5516  0.1379                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

[[4]]
            Df Sum Sq Mean Sq F value Pr(>F)
bbbR         1  0.043  0.0430    0.12  0.747
Residuals    4  1.437  0.3593               

[[5]]
            Df Sum Sq Mean Sq F value Pr(>F)
cccD         1 0.1129  0.1129    0.33  0.596
Residuals    4 1.3673  0.3418 

【讨论】:

  • 太完美了,谢谢!我可以使用 bash 匹配其余部分。
  • 我现在在工作数据集上遇到一个不同的错误:Error in contrasts(*tmp*, value = contr.funs[1 + isOF[nn]]) : contrasts can be applied only to factors with 2 or more levels 由于字符,我无法粘贴 dput 的完整输出限制(大约 585k 个字符)。
  • 哦,这是一个比较常见的问题。你需要使用factors吗?将所有内容都转换为字符可能会更好(不确定)。问题是aov 需要两个或更多级别。
  • 谢谢,我会修修补补的。可能是导致问题的那些 N.A。
猜你喜欢
  • 2015-01-09
  • 1970-01-01
  • 2019-05-17
  • 2022-01-17
  • 1970-01-01
  • 2019-09-08
  • 2020-11-10
  • 2013-12-21
  • 2020-01-24
相关资源
最近更新 更多