Estoy tratando duro para agregar una línea de regresión en un ggplot. Probé por primera vez con abline, pero no he podido hacer que funcione. Entonces traté de este…

data = data.frame(x.plot=rep(seq(1,5),10),y.plot=rnorm(50))
ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) +
   geom_smooth(method='lm',formula=data$y.plot~data$x.plot)

Pero no está funcionando bien.

InformationsquelleAutor Remi.b | 2013-03-26

5 Comentarios

  1. 129

    En general, para proveer a su propia fórmula se debe utilizar argumentos x y y que le corresponden a los valores que usted proporcionó en la ggplot() – en este caso x será interpretado como x.plot y y como y.plot. Más información acerca de los métodos de suavizado y la fórmula se puede encontrar en la página de ayuda de la función stat_smooth() como es por defecto stat utilizado por geom_smooth().

    ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) + 
      geom_smooth(method='lm',formula=y~x)

    Si usted está utilizando los mismos valores de x e y que se suministra en el ggplot() llamado y la necesidad de trazar línea de regresión lineal, entonces usted no necesita utilizar la fórmula dentro de geom_smooth(), sólo el suministro de los method="lm".

    ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) + 
      geom_smooth(method='lm')
  2. 34

    Tan sólo pensé que, en caso de tener un modelo ajustado por regresión lineal múltiple, en el mencionado solución no funciona.

    Usted tiene que crear su línea de forma manual como un dataframe que contiene los valores predichos por su original dataframe (en su caso data).

    Tendría este aspecto:

    # read dataset
    df = mtcars
    
    # create multiple linear model
    lm_fit <- lm(mpg ~ cyl + hp, data=df)
    summary(lm_fit)
    
    # save predictions of the model in the new data frame 
    # together with variable you want to plot against
    predicted_df <- data.frame(mpg_pred = predict(lm_fit, df), hp=df$hp)
    
    # this is the predicted line of multiple linear regression
    ggplot(data = df, aes(x = mpg, y = hp)) + 
      geom_point(color='blue') +
      geom_line(color='red',data = predicted_df, aes(x=mpg_pred, y=hp))

    La adición de una línea de regresión en un ggplot

    # this is predicted line comparing only chosen variables
    ggplot(data = df, aes(x = mpg, y = hp)) + 
      geom_point(color='blue') +
      geom_smooth(method = "lm", se = FALSE)

    La adición de una línea de regresión en un ggplot

    • Una cosa a tener en cuenta es la convención es lm(y~x). Tengo un poco de dio la vuelta para una segunda lectura de este ya que la variable que está ‘predecir’ está en el eje de las x. Gran respuesta, aunque.
  3. 5

    La solución obvia el uso de geom_abline:

    geom_abline(slope = data.lm$coefficients[2], intercept = data.lm$coefficients[1])

    Donde data.lm es un lm objeto, y data.lm$coefficients se ve algo como esto:

    data.lm$coefficients
    (Intercept)    DepDelay 
      -2.006045    1.025109 

    Idénticos en la práctica es el uso de stat_function para trazar la recta de regresión como una función de x, haciendo uso de predict:

    stat_function(fun = function(x) predict(data.lm, newdata = data.frame(DepDelay=x)))

    Esto es un poco menos eficiente ya que por defecto n=101 puntos se calculan, pero mucho más flexible, ya que se trama una predicción de la curva para cualquier modelo que soporta predict, tales como no-lineal npreg de paquete de np.

    Nota: Si utiliza scale_x_continuous o scale_y_continuous algunos valores pueden ser de corte y por lo tanto geom_smooth puede que no funcione correctamente. Usar coord_cartesian para hacer zoom en lugar.

    • Y por lo que nunca se preocupe acerca de la adquisición de las fórmulas o simplemente añadiendo un +0 puede utilizar nombres. data.lm$coefficients[['(Intercept)']] y data.lm$coefficients[['DepDelay']].
  4. 2

    Si quieres para adaptarse a otro tipo de modelos, como una curva dosis-respuesta utilizando los modelos logísticos que también tendría que crear más puntos de datos con la función de predecir si usted quiere tener una suave línea de regresión:

    ajuste: el ajuste de una regresión logística de la curva de

    #Create a range of doses:
    mm <- data.frame(DOSE = seq(0, max(data$DOSE), length.out = 100))
    #Create a new data frame for ggplot using predict and your range of new 
    #doses:
    fit.ggplot=data.frame(y=predict(fit, newdata=mm),x=mm$DOSE)
    
    ggplot(data=data,aes(x=log10(DOSE),y=log(viability)))+geom_point()+
    geom_line(data=fit.ggplot,aes(x=log10(x),y=log(y)))
  5. 2

    He encontrado esta función en un blog

     ggplotRegression <- function (fit) {
    
        `require(ggplot2)
    
        ggplot(fit$model, aes_string(x = names(fit$model)[2], y = names(fit$model)[1])) + 
          geom_point() +
          stat_smooth(method = "lm", col = "red") +
          labs(title = paste("Adj R2 = ",signif(summary(fit)$adj.r.squared, 5),
                             "Intercept =",signif(fit$coef[[1]],5 ),
                             " Slope =",signif(fit$coef[[2]], 5),
                             " P =",signif(summary(fit)$coef[2,4], 5)))
        }`

    una vez que ha cargado la función que usted podría simplemente

    ggplotRegression(fit)

    usted también puede ir para ggplotregression( y ~ x + z + Q, data)

    Espero que esto ayude.

Dejar respuesta

Please enter your comment!
Please enter your name here