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
您能帮我找出代码中的错误吗?
首先,您不需要将整个数据传递到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,也许有更好的方法来做您想做的事情(从统计上来说。。]]
考虑用expand.grid
捕获两组列名称的所有可能组合,然后用Map
调用一个元素循环(包装到mapply
),而不是不将结果保存到的三级嵌套for
循环任何对象。