rda() используя условный или ограниченный фактор / упорядоченные переменные в кадрах данных

У меня есть набор данных об окружающей среде, который представляет собой смешанные данные (факторные, упорядоченные и числовые). Я хотел бы использовать следующий метод ввода для rda() функция:

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

Однако, если я введу все 3 фрейма данных таким образом, они должны быть матрицами. Я не хочу преобразовывать ограниченные или условные фреймы данных в матрицы, так как я разложил и упорядочил данные внутри них. Единственный способ найти их в правильном формате - это разложить их по отдельности на все их векторы. Это работает, если вы делаете это вручную, но мне нужно перебрать несколько Условных и Ограниченных фреймов данных. У кого-нибудь есть идеи?

Пример:

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 ответ

rda() будет принимать кадры данных при вызове в rda(X, Y, Z) Режим. Аргументы в ?rda взять матрицу данных сообщества, но фрейм данных является приемлемым и даже предполагается, когда мы конвертируем эти входные данные через as.matrix() И в этом заключается проблема.

Вы rda() звонить с формулой глупо. E сть 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() выходы, не показаны.]

Другие вопросы по тегам