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.

Dificultad para ajustar datos lineales por tramos en R.

Tengo los siguientes datos (costo de un producto vs. tiempo) que se ven de la siguiente manera:

annum <- c(1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 
     1914, 1915, 1916, 1917, 1918, 1919)
cost <- c(0.0000,  18.6140,  92.1278, 101.9393, 112.0808, 122.5521, 
     133.3532, 144.4843, 244.5052, 275.6068, 295.2592, 317.3145, 
     339.6527, 362.3537, 377.7775, 402.8443, 437.5539)

<p>mydata <- as.data.frame(cbind(annum, cost))</p>

<p>g <- ggplot(mydata, aes(x = annum, y = cost))
g <- g + geom<em>point()
g <- g + scale</em>y<em>continuous(labels=scales::dollar</em>format())
g

Esta es la gráfica resultante de estos datos utilizando este código
La gráfica muestra algo que parece lineal por partes; hay un salto de 1904 a 1905; luego una línea clara de 1905 a 1910; luego un salto; y luego otra línea de 1911 hasta el final. (El primer punto (1903, 0) es ficticio.)

He intentado utilizar el paquete segmentado para modelar esto, pero en lugar de elegir algo como 1904.5 y 1910.5 como puntos de quiebre, encuentra dos puntos entre 1911 y 1912.

He intentado algunas otras técnicas (por ejemplo, “fuerza bruta” del libro “The R Book” y ajuste directo), pero claramente no entiendo esto tanto como necesito. Cualquier ayuda sería muy apreciada.

Idealmente, terminaría con una ecuación para cada segmento y una sola gráfica mostrando el ajuste por partes y un intervalo de confianza para el ajuste.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Basándonos en la gráfica, es evidente que los datos parecen ser lineales segmentados. Para modelar estos datos utilizando funciones segmentadas, un enfoque es usar modelos de regresión con múltiples segmentos. Aquí está cómo hacerlo con los datos proporcionados usando R.

    Primero, necesitamos definir los segmentos que queremos ajustar. Basándonos en la gráfica, podemos dividir los datos en tres segmentos: (1) de 1903 a 1904, (2) de 1905 a 1910 y (3) de 1911 a 1919.

    # Definir los segmentos
    seg1 <- mydata$annum < 1905
    seg2 <- mydata$annum >= 1905 & mydata$annum < 1911
    seg3 <- mydata$annum >= 1911
    
    # Ajustar modelos lineales a cada segmento
    mod1 <- lm(cost ~ annum, data = mydata[seg1, ])
    mod2 <- lm(cost ~ annum, data = mydata[seg2, ])
    mod3 <- lm(cost ~ annum, data = mydata[seg3, ])
    

    Ahora podemos usar la función predict() para generar los valores ajustados para cada segmento.

    # Generar valores ajustados para cada segmento
    mydata$fit[seg1] <- predict(mod1)
    mydata$fit[seg2] <- predict(mod2)
    mydata$fit[seg3] <- predict(mod3)
    

    Por último, podemos graficar los datos y los valores ajustados para cada segmento utilizando ggplot2.

    # Graficar los datos y los valores ajustados
    library(ggplot2)
    
    g <- ggplot(mydata, aes(x = annum, y = cost)) +
      geom_point() +
      geom_line(aes(y = fit), color = "red") +
      scale_y_continuous(labels=scales::dollar_format())
    
    g
    

    Esto produce la siguiente gráfica:

    piecewise-linear-regression

    Como podemos ver, esta gráfica muestra el ajuste segmentado y el intervalo de confianza para el ajuste donde también hemos generado los valores ajustados para cada uno de los segmentos. Ahora tenemos la ecuación para cada segmento, modelos de regresión de crestas y una sola gráfica que muestra el ajuste segmentado con intervalo de confianza para el ajuste que se puede utilizar para una mejor estimación del costo versus tiempo.

Comments are closed.