我正在尝试使用R中的manova函数进行多元方差分析.我的问题是我试图找到一种方法来传递因变量列表,而不是手动输入它们,因为有很多并且它们很可怕名.我的数据位于数据框中,其中"unit"是因变量(factor),其余列是各种数字响应变量.例如
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
Run Code Online (Sandbox Code Playgroud)
如果我把manova电话称为
fit <- manova(cbind(C_pct, Cln) ~ unit, data = plots)
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我希望能够传递一长串列,而无需逐个命名,类似于
fit <- manova(cbind(colnames(plots[5:32])) ~ unit, data = plots)
Run Code Online (Sandbox Code Playgroud)
要么
fit <- manove(cbind(plots[,5:32]) ~ unit, data = plots)
Run Code Online (Sandbox Code Playgroud)
我收到了错误
"Error in model.frame.default(formula = as.matrix(cbind(colnames(plots[5:32]))) ~ :
variable lengths differ (found for 'unit')
Run Code Online (Sandbox Code Playgroud)
我确定这是因为我使用cbind错误,但无法弄明白.任何帮助表示赞赏!很抱歉,如果格式很粗糙,这是我发布的第一个问题.
编辑:两种方式(所有3,实际上)工作.谢谢大家!
manova与大多数R建模函数一样,它使用数据集中找到的变量名称构建其公式.但是,当你传递它时colnames,你在技术上传递代表那些变量名称的字符串.因此,该功能不知道如何处理它们和扼流圈.
你可以实际解决这个问题.公式的LHS只需要解析为矩阵; 使用的cbind(C_pct, Cln, ...)是通过评估它的参数的名称获得矩阵的方式C_pct,Cln在数据帧的环境等.但是如果您提供一个矩阵,那么就不需要进行评估.
fit <- manova(as.matrix(plots[, 5:32]) ~ unit, data=plots)
Run Code Online (Sandbox Code Playgroud)
一些笔记.这as.matrix是必要的,因为从这样的数据帧中获取列会返回数据帧.manova我不喜欢这样,所以我们将数据框强制转换为矩阵.其次,假设您没有plots在数据框内调用的实际变量,则可以正常工作plots.这是因为,如果R在数据框中找不到名称,则它会查看调用者的环境,在本例中是全局环境.
您也可以在拟合模型之前创建矩阵
plots$response <- as.matrix(plots[, 5:32])
fit <- manova(response ~ unit, data=plots)
Run Code Online (Sandbox Code Playgroud)