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.

¿Cómo ajustar una función no lineal a los datos en ggplot2 usando un modelo de máxima verosimilitud en R?

El conjunto de datos (x.test, y.test) es un ajuste exponencial. Estoy tratando de ajustar una función no lineal personalizada y adjunto está el código. Los puntos regulares se muestran bien, pero no puedo hacer que la línea de ajuste funcione. ¿Alguna sugerencia?

x.test <- runif(50,2,8)
y.test <- 0.5^(x.test)
df <- data.frame(x.test, y.test)

library(ggpmisc)
my.formula <- y ~ lambda/ (1 + aii*x)
ggplot(data  = df, aes(x=x.test,y=y.test)) +
  geom_point(shape=21, fill="white", color="red", size=3) +
  stat_smooth(method="nls",formula =  y.test ~ lambda/ (1 + aii*x.test), method.args=list(start=c(lambda=1000,aii=-816.39)),se=F,color="red") +
   geom_smooth(method="lm", formula = my.formula , col = "red") + stat_poly_eq(formula = my.formula, aes(label = stringr::str_wrap(paste(..eq.label.., ..rr.label.., sep = "~~~"))),  parse = TRUE, size = 2.5, col = "red") + stat_function(fun=function (x.test){
  y.test ~ lambda/ (1 + aii*x.test)}, color = "blue")

enter image description here

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código parece ser el uso de y.test en lugar de simplemente y en el argumento formula de stat_smooth y stat_function. Cambiar y.test a solo y debería resolver el problema.

    Aquí está el código corregido:

    x.test <- runif(50,2,8)
    y.test <- 0.5^(x.test)
    df <- data.frame(x.test, y.test)
    
    library(ggpmisc)
    my.formula <- y ~ lambda / (1 + aii*x)
    
    ggplot(data = df, aes(x = x.test, y = y.test)) + 
      geom_point(shape = 21, fill = "white", color = "red", size = 3) + 
      stat_smooth(method = "nls", formula = y ~ lambda / (1 + aii*x), 
                  method.args = list(start = c(lambda = 1000, aii = -816.39)), 
                  se = FALSE, color = "red") +
      geom_smooth(method = "lm", formula = my.formula, col = "red") + 
      stat_poly_eq(formula = my.formula, 
                   aes(label = stringr::str_wrap(paste(..eq.label.., ..rr.label.., sep = "~~~"))),  
                   parse = TRUE, size = 2.5, col = "red") + 
      stat_function(fun = function(x){lambda / (1 + aii*x)}, color = "blue")
    

    Esto debería producir la línea de ajuste junto con el gráfico de puntos regular.

Comments are closed.