rda()在数据帧中使用条件或约束因子/有序变量

时间:2013-01-25 21:35:41

标签: r vegan

我有一个环境数据集,它是混合数据(因子,有序和数字)。我想对rda()函数使用以下输入方法:

rda(X= Community, Y=Constrained, Z= Conditional)

但是,如果我以这种方式输入所有3个数据帧,则它们需要是矩阵。我不想将Constrained或Conditional数据帧转换为矩阵,因为我已经在其中分解和排序了数据。我发现以正确格式输入它们的唯一方法是将它们分别分解为所有向量。如果您手动执行此操作,则可以正常工作,但我需要遍历几个条件和约束数据帧。有没有人有任何想法?

一个例子:

library(vegan)
data(dune)
data(dune.env)

rda(dune ~ dune.env$A1 + dune.env$Moisture + dune.env$Management + 
    Condition(dune.env$Use + dune.env$Manure)) 

这就是我想要做的事情,但要编写代码来迭代数据集是很长的事情并且非常困难

rda(X=dune, Y=dune.env[,1:3], Z=dune.env[,4:5]) 

如果这是可能的话,它会很棒,因为我可以将我的约束变量放在一个数据框中,而将条件放在另一个数据框中,但它们必须是矩阵,这会混淆有序和因子变量。

非常感谢您的帮助

罗布

1 个答案:

答案 0 :(得分:0)

rda()模式下调用时,

rda(X, Y, Z)将采用数据帧。 ?rda中的参数涉及社区数据矩阵,但数据框是可接受的,甚至假设我们通过as.matrix()转换这些输入,这就是问题所在。

rda()打电话给公式是愚蠢的。有一个data参数,您可以这样做:

rda(dune ~ A1 + Moisture + Management + Condition(Use + Manure), data = dune.env)

这更容易,更简洁。

你也可以采取捷径,

rda(dune ~ . + Condition(Use + Manure), data = dune.env)

通过使用.并且只在数据对象中具有模型拟合所需的变量。

你可以通过让R为你建立公式来做到这一点。

nams <- names(dune.env)
form <- formula(paste("dune ~", paste(nams[1:3], collapse = " + "),
                      "+ Condition(", paste(nams[4:5], collapse = " + "), ")"))
rda(form, data = dune.env)

虽然这可能看起来很复杂,但它可以轻松地包含在一个函数中:

buildF <- function(X, Y, Z, data) {
  nams <- names(data)
  X <- deparse(substitute(X))
  f <- formula(paste(X, " ~", paste(nams[Y], collapse = " + "),
               "+ Condition(", paste(nams[Z], collapse = " + "), ")"))
  environment(f) <- parent.frame()
  f
}

在使用中给出:

> buildF(dune, 1:3, 4:5, data = dune.env)
dune ~ A1 + Moisture + Management + Condition(Use + Manure)
> f <- buildF(dune, 1:3, 4:5, data = dune.env)
> f
dune ~ A1 + Moisture + Management + Condition(Use + Manure)
> rda(f, data = dune.env)
Call: rda(formula = dune ~ A1 + Moisture + Management +
Condition(Use + Manure), data = dune.env)

              Inertia Proportion Rank
Total         84.1237     1.0000     
Conditional   35.3628     0.4204    6
Constrained   27.8434     0.3310    6
Unconstrained 20.9175     0.2487    7
Inertia is variance 
Some constraints were aliased because they were collinear (redundant)

Eigenvalues for constrained axes:
  RDA1   RDA2   RDA3   RDA4   RDA5   RDA6 
14.674  4.718  2.756  2.346  2.085  1.265 

Eigenvalues for unconstrained axes:
   PC1    PC2    PC3    PC4    PC5    PC6    PC7 
6.6269 4.3091 3.5491 2.5465 2.3403 0.9335 0.6121 

[与其他rda()输出完全相同,未显示。]