Fórmula con número dinámico de variables.

Resuelto Max asked hace 54 años • 5 respuestas

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?)
   }
}
Max avatar Jan 01 '70 08:01 Max
Aceptado

Ver ?as.formula, por ejemplo:

factors <- c("factor1", "factor2")
as.formula(paste("y~", paste(factors, collapse="+")))
# y ~ factor1 + factor2

donde factorshay un vector de caracteres que contiene los nombres de los factores que desea utilizar en el modelo. Esto lo puedes pegar en un lmmodelo, 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
Joris Meys avatar Feb 09 '2011 22:02 Joris Meys

Una función que a menudo se olvida es reformulate. De ?reformulate:

reformulatecrea 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

mnel avatar Nov 14 '2012 00:11 mnel