首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用for循环在R中使用manova?

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

Stack Overflow用户
提问于 2020-03-14 21:24:18
回答 2查看 101关注 0票数 0
代码语言:javascript
复制
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的数量变量放在D,在dataTwo中,我把D的范畴变量放在D中,我想迭代D,用manova对每一对量化变量和每一个范畴变量。

但是,当我运行它时,我会得到以下错误:

代码语言:javascript
复制
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

你能帮我找出我的密码出了什么问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-14 22:26:31

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

代码语言:javascript
复制
# BUILD DATA FRAME OF ALL POSSIBLE COMBINATIONS
params_df <- expand.grid(cat1 = c("age", "child", "balance", "previous"),
                         cat2 = c("age", "child", "balance", "previous"),
                         quant = c("job", "marital", "education", "default", 
                                   "housing", "loan", "contact", "month"))

# REMOVE ROWS WHERE CATEGORIES ARE THE SAME
params_df <- subset(params_df, cat1 != cat2)


# USER-DEFINED METHOD TO CALL manova WITH DYNAMIC FORMULA AND RESULTS
anova_test <- function(dataSet, cat1, cat2, quant) {

   frml <- as.formula(paste0("cbind(", cat1, ",", cat2, ") ~ ", quant))
   res.man <- manova(frml, data = dataSet) 

   res.list <- list(estimates = summary(res.man),
                    aov = summary.aov(res.man))

   return(res.list)
}

# RETREIVE DATA
D <- apply_impute(data)

# BUILD LIST OF MANOVA RESULTS
manova_list <- Map(anova_test, 
                   cat1 = params_df$cat1,
                   cat2 = params_df$cat2, 
                   quant = params_df$quant,
                   MoreArgs = list(dataSet = D))

输出

代码语言:javascript
复制
# DISPLAY SELECT RESULTS BY INDEX AND NAMES
manova_list[[1]]$estimates       
manova_list[[1]]$aov

manova_list[[2]]$estimates
manova_list[[2]]$aov
# ...


# DISPLAY ALL RESULTS
lapply(manova_list, `[[`, "estimates")
lapply(manova_list, `[[`, "aov")
票数 1
EN

Stack Overflow用户

发布于 2020-03-14 21:58:47

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

然后,在建模行中,您需要提供实际数据,而不仅仅是列名,并且不需要指定dataset,因为您已经在提供数据。

例:

代码语言:javascript
复制
res <- manova(dataOne[,c(i,k)] ~ dataTwo[,j])

您可以使用列名和完整的数据集来完成这一任务,但这是不必要的困难。与代码的不同之处在于使用get将名称作为字符串转换为它所引用的对象。

代码语言:javascript
复制
 res <- manova(cbind(get(colnames(dataOne)[i]), get(colnames(dataOne)[k])) ~ get(colnames(dataTwo)[j]), data = dataSet)

最后,我不知道为什么你想要这么多这样的配对many,也许有更好的方法来做你想做的事情(从统计学上讲)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60687442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档