使用for循环在R中使用manova吗?

问题描述 投票:0回答:2
anova_test <- function(dataSet, dataOne, dataTwo){
  for (j in 1:8){
    for (i in 1:4){
      for (k in i:4){
        if(i!=k){
        res <- manova(cbind(colnames(dataOne)[i], colnames(dataOne)[k]) ~ colnames(dataTwo)[j], data = dataSet)
        summary(res.man)
        # Look to see which differ
        summary.aov(res.man)
        }
      }
    }
  }
}

D <- apply_impute(data)
dataOne <- select(D, age, child, balance, previous)
dataTwo <- select(D, job, marital, education, default, housing, loan,
                            contact, month)
anova_test(D, dataOne, dataTwo)

这是我的代码。 D是数据集。在dataOne中,我放置了D的定量变量,在dataTwo中,我放置了D的类别变量。我想遍历D以对每个类别变量中的每对定量变量使用manova。

但是当我运行它时,出现以下错误:

Error in `[[<-.data.frame`(`*tmp*`, i, value = 1:2) : 
  replacement has 2 rows, data has 1
De plus : Warning message:
In storage.mode(v) <- "double" :

 Error in `[[<-.data.frame`(`*tmp*`, i, value = 1:2) : 
  replacement has 2 rows, data has 1

您能帮我找出代码中的错误吗?

r for-loop
2个回答
0
投票

首先,您不需要将整个数据传递到anova_test函数中,因为您已经在两个块中传递了它。

然后,在建模行中,您不仅需要提供列名,而且还需要提供实际数据,并且由于已经在提供数据,因此无需指定数据集。

例如:

res <- manova(dataOne[,c(i,k)] ~ dataTwo[,j])

您可以使用列名和完整的数据集来执行此操作,但这不必要地更加困难。与您的代码的不同之处在于使用get将名称作为字符串转换为它所引用的对象。

 res <- manova(cbind(get(colnames(dataOne)[i]), get(colnames(dataOne)[k])) ~ get(colnames(dataTwo)[j]), data = dataSet)

最后,我不确定为什么您要这么多成对的MANOVA,也许有更好的方法来做您想做的事情(从统计上来说。。]]


0
投票

考虑用expand.grid捕获两组列名称的所有可能组合,然后用Map调用一个元素循环(包装到mapply),而不是不将结果保存到的三级嵌套for循环任何对象。

© www.soinside.com 2019 - 2024. All rights reserved.