es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

ggeffects muestra diferentes resultados de predicción de un modelo lm extraído como un modelo de parsnip, a pesar de tener los mismos coeficientes.

Tengo una pregunta sobre las predicciones usando ggeffects, lo cual me está dando resultados completamente diferentes si uso un ajuste lm tradicional o un ajuste de modelo parsnip extraído (a pesar de tener los mismos coeficientes).
Aquí hay un ejemplo…

library(tidyverse)
library(tidymodels)
library(ggeffects)

test_df <- structure(list(weight = c(-1.7, 0, 0.6, 0.6, -0.7, -0.3, -0.6, 
-1, -1, 2, 0.1, -0.6, -1.5, 2, -0.7, -0.2, -0.9, -0.6, 1.1, -2, 
1.4, -1, -1.1, 0.5, 1.3, 0, -0.5, -3, 1.1, -0.6), steps = c(19217, 
15758, 14124, 14407, 5565, 20860, 17536, 17156, 17219, 652, 1361, 
8524, 1169, 3117, 3135, 1917, 4267, 7067, 8927, 2436, 3014, 5281, 
8104, 6836, 8939, 4923, 6885, 10581, 10370, 11024), calories = c(1943, 
1581, 1963, 1551, 1699, 1789, 1550, 2036, 1707, 1522, 1672, 1994, 
1588, 1506, 1678, 1673, 1662, 1906, 1814, 1609, 1799, 1825, 1654, 
2291, 1788, 2019, 1911, 1589, 2177, 2137)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -30L)) %>% 
  as_tibble(.)

Ajuste lm

“`{R}
lmmod_simp <- lm(weight ~ steps * calories, data = test_df)


### tidymodels ```{R} linear_reg_lm_spec <- linear_reg() %>% set_engine('lm') basic_rec <- recipe(weight ~ steps + calories, test_df) %>% step_interact(terms = ~ steps:calories) lm_wflw <- workflow() %>% add_recipe(basic_rec) %>% add_model(linear_reg_lm_spec) lm_fit <- fit(lm_wflw, data = test_df) lm_fit_extracted <- lm_fit %>% extract_fit_parsnip()

Cuando veo el resultado, ambos tienen los mismos coeficientes

lmmod_simp

lm_fit_extracted

Pero cuando voy a predecir, las predicciones son completamente diferentes

“`{R}
ggemmeans(lmmod_simp, terms = c("steps", "calories[1500,2000,2500]")) %>%
as.data.frame() %>%
ggplot(aes(x,predicted, color=group, linetype = group))+
geom_line()

<pre><code>[modlm 1](https://i.stack.imgur.com/MFLzh.png)

“`{R}
ggemmeans(lm_fit_extracted, terms = c(“steps”, “calories[1500,2000,2500]”)) %>%
as.data.frame() %>%
ggplot(aes(x,predicted, color=group, linetype = group))+
geom_line()

mod lm2

Quizás no puedo/no debería usar el objeto de ajuste parsnip de esta manera, pero parece extraño ya que muestran los mismos coeficientes.
¡Aprecio cualquier ayuda!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Es posible que la diferencia en las predicciones se deba al hecho de que el objeto lm y el objeto parsnip extraído tienen diferentes configuraciones de predicción predeterminadas. La función ggeffects asume una rejilla de predicción predeterminada para trazar los valores predichos, que pueden no ser los mismos para ambos modelos. Puedes intentar establecer manualmente la rejilla de predicción para ambos modelos utilizando la función predict(), y luego trazar los valores predichos. Por ejemplo:

    “`{r}
    #establecer la rejilla de predicción
    new_data <- expand.grid(steps = seq(min(test_df$steps), max(test_df$steps), by = 1000),
    calories = c(1500, 2000, 2500))

    #predecir para el ajuste linear
    lm_preds <- predict(lmmod_simp, newdata = new_data)

    #predecir para el ajuste parsnip
    parsnip_preds <- predict(lm_fit_extracted, new_data = new_data)

    #combinar las predicciones con los datos originales
    pred_df <- bind_rows(data.frame(model = "lm", preds = lm_preds), data.frame(model = "parsnip", preds = parsnip_preds)) %>%
    bind_cols(new_data)

    #trazar los valores predichos
    pred_df %>% ggplot(aes(steps, preds, color = calories, linetype = model)) +
    geom_line() +
    labs(title = “Predicciones para diferentes modelos”, x = “Pasos”, y = “Peso”)
    “`

    Este código establece una nueva rejilla de predicción con pasos que van desde el mínimo hasta el máximo de los datos originales, con incrementos de 1000, y las calorías configuradas en valores fijos de 1500, 2000 y 2500. Luego, predice el peso para cada modelo en cada combinación de pasos y calorías utilizando la función predict(), y combina los resultados en un único marco de datos. Finalmente, los valores predichos se trazan en función de los pasos para cada modelo y nivel de calorías utilizando ggplot().

    Esto debería darte una mejor idea de si los modelos realmente están produciendo predicciones diferentes o si la diferencia se debe a la configuración predeterminada de la rejilla utilizada por ggeffects().

Comments are closed.