首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的manova调用中的cbind出现问题

R中的manova调用中的cbind出现问题
EN

Stack Overflow用户
提问于 2013-06-19 01:27:15
回答 2查看 2.6K关注 0票数 8

我试图用R中的manova函数做多元方差分析,我的问题是,我试图找到一种方法来传递因变量列表,而不是手动键入所有变量,因为有很多变量,它们的名字也很糟糕。我的数据在一个数据框中,其中"unit“是因变量(因子),其余的列是各种数值响应变量。例如:

代码语言:javascript
复制
  unit C_pct  Cln C_N_mol Cnmolln C_P_mol N_P_mol
1    C 48.22 3.88   53.92    3.99 3104.75   68.42
2    C 49.91 3.91   56.32    4.03 3454.53   62.04
3    C 50.75 3.93   56.96    4.04 3922.01   69.16
4   SH 50.72 3.93   46.58    3.84 2590.16   57.12
5   SH 51.06 3.93   43.27    3.77 2326.04   53.97
6   SH 48.62 3.88   40.97    3.71 2357.16   59.67

如果我将manova调用编写为

代码语言:javascript
复制
fit <- manova(cbind(C_pct, Cln) ~ unit, data = plots) 

它工作得很好,但我希望能够传递一长串列,而不是逐个命名它们,例如

代码语言:javascript
复制
fit <- manova(cbind(colnames(plots[5:32])) ~ unit, data = plots) 

代码语言:javascript
复制
fit <- manove(cbind(plots[,5:32]) ~ unit, data = plots)

我得到了错误

代码语言:javascript
复制
"Error in model.frame.default(formula = as.matrix(cbind(colnames(plots[5:32]))) ~  : 
  variable lengths differ (found for 'unit')

我确信这是因为我错误地使用了cbind,但是我搞不清楚。如有任何帮助,我们不胜感激!抱歉,如果格式是粗糙的,这是我张贴的第一个问题。

编辑:这两种方式(实际上都是3种方式)都有效。谢谢大家!

EN

回答 2

Stack Overflow用户

发布于 2013-06-19 01:50:53

与大多数R建模函数一样,manova使用在数据集中找到的变量的名称构建其公式。但是,当您向它传递colnames时,从技术上讲,您传递的是表示这些变量名称的字符串。因此,该函数不知道如何处理它们,并且会卡住。

你实际上可以绕过这个问题。公式的LHS只需解析为矩阵;cbind(C_pct, Cln, ...)的使用是一种通过在数据框环境中评估其参数名称C_pctCln等来获得矩阵的方法。但是如果你一开始就提供了一个矩阵,那么就不需要求值了。

代码语言:javascript
复制
fit <- manova(as.matrix(plots[, 5:32]) ~ unit, data=plots)

一些笔记。as.matrix是必需的,因为从这样的数据框中获取列将返回一个数据框。manova不会喜欢这样,所以我们将数据帧强制转换为矩阵。其次,假设您的数据框plots中没有名为plots的实际变量,这种方法是可行的。这是因为,如果R在数据框中找不到名称,它就会查找调用者的环境,在本例中是全局环境。

也可以在拟合模型之前创建矩阵,方法是

代码语言:javascript
复制
plots$response <- as.matrix(plots[, 5:32])
fit <- manova(response ~ unit, data=plots)
票数 9
EN

Stack Overflow用户

发布于 2013-06-19 02:02:08

您可以将公式构建为字符串,并将其转换为公式:

代码语言:javascript
复制
responses <- paste( colnames( plots )[2:6], collapse=",")
myformula <- as.formula( paste0( "cbind(", responses , ")~ unit" ) )
manova( myformula, data = plots ) 

Call:
   manova(myformula, data = plots)

Terms:
                     unit Residuals
resp 1                0.4       6.8
resp 2                  0         0
resp 3              220.6      21.0
resp 4                0.1       0.0
resp 5          1715135.8  377938.1
Deg. of Freedom         1         4

Residual standard error: 1.3051760.027080132.293640.04966555307.3834
Estimated effects may be unbalanced
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17175190

复制
相关文章

相似问题

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