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.

Comprensión de las características de los datos para la regresión lineal en R: Representación gráfica de la distribución de datos sobre la línea de regresión.

Estoy tratando de entender cómo puedo comprender algunas propiedades de los datos cuando trabajo en problemas de regresión. Específicamente, me gustaría ver la distribución de los datos (y) caracterizada como una distribución normal en un valor dado del regresor (x), y luego trazar esta distribución normal (rotada 90 grados) junto con los datos y la línea de regresión.

Esto es con lo que estoy trabajando para tratar de entender las cosas (este código funciona bien):

library(BAS)  # para los datos
x <- bodyfat$Abdomen
y <- bodyfat$Bodyfat
dat <- data.frame(cbind(x, y))

<h1>Modelo lineal</h1>

fat.mod <- lm(y ~ x, data = dat)

<h1>Gráfico del modelo lineal y los datos</h1>

g <- ggplot(bodyfat, aes(x = Abdomen, y = Bodyfat)) + geom<em>point() + 
  geom</em>smooth(method = "lm", se = FALSE)
g

Me gustaría ver una imagen como esta: this example, pero con valores de x que podría especificar (quizás con cierta dispersión en x). Con el gráfico, me gustaría ver las características de la distribución superpuesta (media y desviación estándar o varianza). Es aceptable asumir que los datos están distribuidos normalmente alrededor de la línea de regresión.

Donde realmente me confundo es si especifico un punto que no está explícitamente en los datos (por ejemplo, la media).

¿Alguna idea al respecto?

¡Muchas gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para visualizar la distribución de y caracterizada como una distribución normal en un valor dado del regresor x, puedes seguir estos pasos:

    1. Primero, debes calcular los valores predichos de y para un rango de valores de x utilizando el modelo lineal. Puedes hacer esto con la función predict():
    x_new <- seq(min(x), max(x), length = 100)
    y_pred <- predict(fat.mod, newdata = data.frame(x = x_new), se.fit = TRUE)
    

    Esto crea una secuencia de 100 valores de x que abarcan todo el rango de x en tus datos, y luego utiliza el modelo lineal para predecir los valores correspondientes de y para cada valor de x. El argumento se.fit = TRUE le indica a predict() que también calcule los errores estándar de los valores predichos, los cuales necesitarás posteriormente para crear el área sombreada alrededor de la distribución normal.

    1. Luego, puedes calcular las propiedades de la distribución normal en un valor dado de x. Por ejemplo, si quieres visualizar la distribución de y cuando x = 75, puedes hacer lo siguiente:
    x_val <- 75
    y_mean <- predict(fat.mod, newdata = data.frame(x = x_val))
    y_se <- summary(fat.mod)$sigma * sqrt(1 + 1/fat.mod$df.residual + (x_val-mean(x))^2/var(x))
    

    Esto calcula el valor predicho de y para x = 75 (y_mean), así como el error estándar de esa predicción (y_se). El error estándar tiene en cuenta la incertidumbre en la línea de regresión, así como la desviación del valor de x respecto a la media de los valores de x en tus datos.

    1. Ahora puedes crear la distribución normal y superponerla en el gráfico. Para crear la distribución normal, puedes utilizar la función dnorm():
    y_dist <- dnorm(y_pred$fit, y_mean, y_se)
    

    Esto calcula la densidad de probabilidad en cada valor predicho de y (y_pred$fit) dada la media y el error estándar de la predicción.

    1. Finalmente, puedes graficar la distribución normal con los datos y la línea de regresión:
    library(ggplot2)
    
    ggplot(dat, aes(x = x, y = y)) +
      geom_point() +
      geom_smooth(method = "lm", se = FALSE) +
      geom_line(aes(x = y_dist, y = x_new), color = "blue", size = 1, alpha = 0.6) +
      geom_ribbon(aes(x = y_dist, ymin = x_new, ymax = Inf), fill = "blue", alpha = 0.2) +
      coord_flip() +
      labs(title = paste0("Distribución de y en x = ", x_val), x = "y", y = "x")
    

    Esto grafica los datos y la línea de regresión como antes, y luego agrega una línea azul para la distribución normal y un área sombreada azul alrededor de ella. La función coord_flip() rota el gráfico 90 grados como se solicita. El título del gráfico indica el valor de x que se utilizó para calcular la distribución normal.

    Si deseas visualizar la distribución de y en varios valores de x, puedes colocar los pasos 2-4 dentro de un bucle que itera sobre un vector de valores de x.

Comments are closed.