我试图用R中的manova函数做多元方差分析,我的问题是,我试图找到一种方法来传递因变量列表,而不是手动键入所有变量,因为有很多变量,它们的名字也很糟糕。我的数据在一个数据框中,其中"unit“是因变量(因子),其余的列是各种数值响应变量。例如:
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调用编写为
fit <- manova(cbind(C_pct, Cln) ~ unit, data = plots) 它工作得很好,但我希望能够传递一长串列,而不是逐个命名它们,例如
fit <- manova(cbind(colnames(plots[5:32])) ~ unit, data = plots) 或
fit <- manove(cbind(plots[,5:32]) ~ unit, data = plots)我得到了错误
"Error in model.frame.default(formula = as.matrix(cbind(colnames(plots[5:32]))) ~ :
variable lengths differ (found for 'unit')我确信这是因为我错误地使用了cbind,但是我搞不清楚。如有任何帮助,我们不胜感激!抱歉,如果格式是粗糙的,这是我张贴的第一个问题。
编辑:这两种方式(实际上都是3种方式)都有效。谢谢大家!
发布于 2013-06-19 01:50:53
与大多数R建模函数一样,manova使用在数据集中找到的变量的名称构建其公式。但是,当您向它传递colnames时,从技术上讲,您传递的是表示这些变量名称的字符串。因此,该函数不知道如何处理它们,并且会卡住。
你实际上可以绕过这个问题。公式的LHS只需解析为矩阵;cbind(C_pct, Cln, ...)的使用是一种通过在数据框环境中评估其参数名称C_pct、Cln等来获得矩阵的方法。但是如果你一开始就提供了一个矩阵,那么就不需要求值了。
fit <- manova(as.matrix(plots[, 5:32]) ~ unit, data=plots)一些笔记。as.matrix是必需的,因为从这样的数据框中获取列将返回一个数据框。manova不会喜欢这样,所以我们将数据帧强制转换为矩阵。其次,假设您的数据框plots中没有名为plots的实际变量,这种方法是可行的。这是因为,如果R在数据框中找不到名称,它就会查找调用者的环境,在本例中是全局环境。
也可以在拟合模型之前创建矩阵,方法是
plots$response <- as.matrix(plots[, 5:32])
fit <- manova(response ~ unit, data=plots)发布于 2013-06-19 02:02:08
您可以将公式构建为字符串,并将其转换为公式:
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 unbalancedhttps://stackoverflow.com/questions/17175190
复制相似问题