8

我正在尝试使用 R 中的 manova 函数进行多元方差分析。我的问题是我试图找到一种方法来传递因变量列表而无需手动输入它们,因为它们有很多而且它们有可怕的名字。我的数据在一个数据框中,其中“单位”是因变量(因子),其余列是各种数值响应变量。例如

  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 种方式)都有效。谢谢大家!

4

2 回答 2

9

manova与大多数 R 建模函数一样,根据数据集中的变量名称构建其公式。但是,当您将 传递给它时colnames,从技术上讲,您传递的是代表这些变量名称的字符串。因此,该函数不知道如何处理它们,并且窒息。

你实际上可以解决这个问题。公式的 LHS 只需解析为矩阵;的使用cbind(C_pct, Cln, ...)是一种通过在数据框环境中评估其参数的名称来获取矩阵的方法C_pctCln等等。但是,如果您提供一个矩阵作为开始,则无需评估。

fit <- manova(as.matrix(plots[, 5:32]) ~ unit, data=plots)

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

您还可以在拟合模型之前创建矩阵,使用

plots$response <- as.matrix(plots[, 5:32])
fit <- manova(response ~ unit, data=plots)
于 2013-06-18T17:50:52.977 回答
3

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

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
于 2013-06-18T18:02:08.297 回答