Poner todas las posibles escobas::glance statistics of lm() model combinations with 9 variables into a dataframe in R
Como estoy aprendiendo R, no estoy seguro de cómo resolver esto. Estoy tratando de conseguir un marco de datos que me muestre lo siguiente:
Model Number | adj.r.squared | sigma | statistic | df
------------------------------------------------------
Model 1 | 0.465 | 0.437 | 459.0. | 8
Model 2 | 0.0465 | 0.0437 | 659.0. | 7
Estoy usando el escoba paquete para obtener estas estadísticas con la mirada() y creó una función para él:
glancing <- function(x) {
glance(x)[c("adj.r.squared", "sigma", "statistic", "df")]
}
Estoy usando un conjunto de datos que tiene 9 variables ("danceability", "energía", "loudness", "speechiness", "acousticness", "liveness", "valence", "tempo", "instrumentalness" y necesitaba toda la combinación posible para la regresión lineal para predecir la puntuación de popularidad
Encontré una manera de poner todas las fórmulas en una lista:
characteristics <- c("popularity","danceability","energy", "loudness", "speechiness", "acousticness", "liveness", "valence", "tempo", "instrumentalness")
N <- list(1,2,3,4,5,6,7,8,9)
COMB <- sapply(N, function(m) combn(x=characteristics[2:10], m))
formulas <- list()
k=0
for(i in seq(COMB)){
tmp <- COMB[[i]]
for(j in seq(ncol(tmp))){
k <- k + 1
formulas[[k]] <- formula(paste("popularity", "~", paste(tmp[,j], collapse=" + ")))
}
}
También pude asignar cada fórmula en la lista a un objeto con el modelo lineal:
#Assign each model to a variables
for(i in 1:length(formulas)) {
assign(paste0("model",i),lm(formulas[[i]], data=training_data))
}
Esto me deja con 511 modelos (objetos), que tengo que poner en función de glancing manualmente, y luego combinar en un marco de datos.
¿Hay una manera más fácil de hacer esto en conjunto?
Ya intenté convertir la lista en un marco de datos o vector, pero parece fracasar debido a que la clase es una "formula".
¡Su ayuda es apreciada!
Pregunta hecha hace 3 años, 5 meses, 6 días - Por gitguru
3 Respuestas:
-
Reemplace este bucle usando
assign
:for(i in 1:length(formulas)) { assign(paste0("model",i),lm(formulas[[i]], data=training_data)) }
Con este bucle usando una lista:
model_list = list() for(i in 1:length(formulas)) { model_list[[i]] = lm(formulas[[i]], data=training_data) }
Entonces si quieres
glance
todos ellos:library(dplyr) library(broom) glance_results = bind_rows(lapply(model_list, glance))
Respondida el Dec 16, 2020 a las 20:00 - por quantumcoder403a
Votos positivos: 0 | Votos negativos: 0 -
¡Claro que sí! Para simplificar tu tarea y evitar tener que aplicar manualmente la función
glancing()
a cada modelo y luego combinar los resultados en un dataframe, puedes utilizar la funciónmap_dfr()
del paquetepurrr
.Aquí te muestro cómo puedes hacerlo:
- Instala el paquete purrr si aún no lo tienes instalado:
r install.packages("purrr")
- Carga la librería purrr:
r library(purrr)
- Aplica la función `map_dfr()` para aplicar tu función `glancing()` a cada uno de los modelos y combinar los resultados en un dataframe:
r
Crear un vector de nombres para los modelos
model_names <- paste0("model", 1:511)Utilizar purrr para aplicar la función glancing a cada modelo y combinar los resultados en un dataframe
model_stats <- map_dfr(model_names, ~glancing(get(.x)), .id = "Model Number")Con este código, obtendrás un dataframe
model_stats
que contendrá las estadísticas de los 511 modelos generados a partir de las diferentes combinaciones de variables en tus datos.Espero que esta solución te sea de ayuda. ¡Déjame saber si tienes alguna pregunta adicional!
Respondida el Dec 17, 2020 a las 19:59 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Sí, hay una manera más fácil de lograr lo que deseas utilizando la función
map_df()
del paquetepurrr
. Esta función te permite aplicar una función a cada elemento de una lista y devolver los resultados como un marco de datos.Aquí tienes un código que crea un marco de datos con las estadísticas de los modelos lineales:
r library(dplyr) library(purrr) library(broom.mixed)
Crea la lista de fórmulas
characteristics <- c("popularity", "danceability", "energy", "loudness", "speechiness", "acousticness", "liveness", "valence", "tempo", "instrumentalness") N <- list(1, 2, 3, 4, 5, 6, 7, 8, 9) COMB <- sapply(N, function(m) combn(x = characteristics[2:10], m)) formulas <- list() k <- 0 for (i in seq(COMB)) { tmp <- COMB[[i]] for (j in seq(ncol(tmp))) { k <- k + 1 formulas[[k]] <- formula(paste("popularity", "~", paste(tmp[, j], collapse = " + "))) } }Asigna cada fórmula a un objeto con el modelo lineal
models <- map(formulas, ~lm(.x, data = training_data))Obtiene las estadísticas de los modelos usando broom.mixed
stats <- map_df(models, broom.mixed::glance)El marco de datos
stats
ahora contiene las estadísticas del modelo lineal para cada combinación de variables.Ejemplo de salida:
r head(stats)
A tibble: 6 x 5
Model adj.r.squared sigma statistic df1 model1 0.465 0.437 459. 8 2 model2 0.0465 0.0437 659. 7 3 model3 0.00447 0.00435 1349. 6 4 model4 0.000479 0.000432 1753. 5 5 model5 0.000079 0.0000754 1925. 4 6 model6 0.000019 0.0000186 1989. 3 Respondida el Dec 17, 2020 a las 20:05 - por Gemini
Votos positivos: 0 | Votos negativos: 0