Формула с динамическим числом переменных
предположим, есть какие-то данные.кадр foo_data_frame и нужно найти регрессию целевого столбца Y по некоторым другим столбцам. Для этой цели обычно используются некоторые формулы и модели. Например:
linear_model <- lm(Y ~ FACTOR_NAME_1 + FACTOR_NAME_2, foo_data_frame)
Это хорошо работает, если формула кодируется статически. Если требуется укоренить несколько моделей с постоянным числом зависимых переменных (скажем, 2), это можно рассматривать следующим образом:
for (i in seq_len(factor_number)) {
for (j in seq(i + 1, factor_number)) {
linear_model <- lm(Y ~ F1 + F2, list(Y=foo_data_frame$Y,
F1=foo_data_frame[[i]],
F2=foo_data_frame[[j]]))
# linear_model further analyzing...
}
}
мой вопрос как сделать то же самое влияние, когда количество переменных изменяется динамически во время выполнения программы?
for (number_of_factors in seq_len(5)) {
# Then root over subsets with #number_of_factors cardinality.
for (factors_subset in all_subsets_with_fixed_cardinality) {
# Here I want to fit model with factors from factors_subset.
linear_model <- lm(Does R provide smth to write here?)
}
}
5 ответов:
посмотреть
?as.formula
, например:factors <- c("factor1", "factor2") as.formula(paste("y~", paste(factors, collapse="+"))) # y ~ factor1 + factor2
здесь
factors
- это символьный вектор, содержащий имена факторов, которые вы хотите использовать в модели. Это вы можете вставить вlm
модель, например:set.seed(0) y <- rnorm(100) factor1 <- rep(1:2, each=50) factor2 <- rep(3:4, 50) lm(as.formula(paste("y~", paste(factors, collapse="+")))) # Call: # lm(formula = as.formula(paste("y~", paste(factors, collapse = "+")))) # Coefficients: # (Intercept) factor1 factor2 # 0.542471 -0.002525 -0.147433
часто забытая функция
reformulate
. От?reformulate
:
reformulate
создает формулу из символьного вектора.
простой пример:
listoffactors <- c("factor1","factor2") reformulate(termlabels = listoffactors, response = 'y')
даст такую формулу:
y ~ factor1 + factor2
хотя это явно не задокументировано, вы также можете добавить условия взаимодействия:
listofintfactors <- c("(factor3","factor4)^2") reformulate(termlabels = c(listoffactors, listofintfactors), response = 'y')
даст:
y ~ factor1 + factor2 + (factor3 + factor4)^2
еще одним вариантом может быть использование матрицы в Формуле:
Y = rnorm(10) foo = matrix(rnorm(100),10,10) factors=c(1,5,8) lm(Y ~ foo[,factors])