gpt4 book ai didi

r - r 中 manova 调用中的 cbind 问题

转载 作者:行者123 更新时间:2023-12-04 11:08:26 25 4
gpt4 key购买 nike

我正在尝试使用 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 种方式)都有效。谢谢大家!

最佳答案

manova与大多数 R 建模函数一样,根据数据集中的变量名称构建其公式。但是,当您通过它时 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)

关于r - r 中 manova 调用中的 cbind 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17175190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com