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()
выходы, не показаны.]