Fórmula con número dinámico de variables.
Supongamos que hay algún data.frame foo_data_frame y uno quiere encontrar la regresión de la columna de destino Y mediante algunas otras columnas. Para ello se suele utilizar alguna fórmula y modelo. Por ejemplo:
linear_model <- lm(Y ~ FACTOR_NAME_1 + FACTOR_NAME_2, foo_data_frame)
Eso funciona bien si la fórmula está codificada estáticamente. Si se desea analizar varios modelos con un número constante de variables dependientes (digamos, 2), se puede tratar así:
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...
}
}
Mi pregunta es ¿cómo lograr el mismo efecto cuando la cantidad de variables cambia dinámicamente durante la ejecución del programa?
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?)
}
}
Ver ?as.formula
, por ejemplo:
factors <- c("factor1", "factor2")
as.formula(paste("y~", paste(factors, collapse="+")))
# y ~ factor1 + factor2
donde factors
hay un vector de caracteres que contiene los nombres de los factores que desea utilizar en el modelo. Esto lo puedes pegar en un lm
modelo, por ejemplo:
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
Una función que a menudo se olvida es reformulate
. De ?reformulate
:
reformulate
crea una fórmula a partir de un vector de caracteres.
Un ejemplo sencillo:
listoffactors <- c("factor1","factor2")
reformulate(termlabels = listoffactors, response = 'y')
producirá esta fórmula:
y ~ factor1 + factor2
Aunque no está documentado explícitamente, también puedes agregar términos de interacción:
listofintfactors <- c("(factor3","factor4)^2")
reformulate(termlabels = c(listoffactors, listofintfactors),
response = 'y')
rendirá:
y ~ factor1 + factor2 + (factor3 + factor4)^2