14 votos

Encontrar el punto de cambio en los datos de una por trozos linear función

Saludos,

Estoy realizando la investigación que ayudará a determinar que el tamaño del espacio observado y el tiempo transcurrido desde el big bang. Esperamos que usted puede ayudar!

Tengo datos conforme a una por trozos linear función que deseo realizar dos regresiones lineales. Hay un punto en que cambian la pendiente y el intercepto, y necesito (un programa para escribir) este punto.

¿Pensamientos?

9voto

Marc-Andre R. Puntos 789

R paquete strucchange puede ayudarle. Ver en la viñeta, tiene un agradable Resumen Cómo resolver problemas similares.

6voto

jldugger Puntos 7490

Este es un problema de detección de changepoint (offline). Nuestra discusión anterior proporciona referencias a artículos de revistas y código R. Mira primero las Barry y Hartigan «modelo de partición del producto», ya que cambios en la pendiente y tiene implementaciones eficientes.

6voto

ESRogs Puntos 1381

Si el número de puntos no es demasiado grande, puedes probar todas las posibilidades. Supongamos que los puntos son $X_i=(x_i,y_i)$ donde $i=1,..,N$. Que, puede bucle con $j$ $2$ $N-2$ y montar dos líneas a $\{X_1,...,X_j\}$ y $\{X_{(j+1)},...,X_N\}$. Finalmente, escoges $j$ para que la suma de suma de cuadrados residuales para ambas líneas es mínima.

3voto

Pascal Paradis Puntos 2833

También el paquete segmentado me ha ayudado con problemas similares en el pasado.

3voto

Mohammadreza Puntos 1964

He construido en mbq la respuesta de que la búsqueda de todas las posibilidades. Además, yo hago esto:

  • Comprobar la importancia de los dos tramos de modelos para asegurarse de que los coeficientes son significativos
  • Comprobar la diferencia a la suma de los cuadrados de los residuos para el modelo completo
  • Confirmar mi modelo visualmente (asegúrese de que no es algo sin sentido).

Por qué comprobar el significado? Eso es porque el punto de que con el mínimo de la ESS tiene sentido si cualquiera de trozos modelo se ajusta a los datos muy mal. Esto puede suceder por dos muy correlacionadas con las variables sin un claro punto de ruptura donde laderas de cambio.

Vamos a ver este enfoque simple con un fácil de caso de prueba:

x <- c(-50:50)
y <- abs(x)
plot(x,y,pch=19)

enter image description here

El punto de corte es, obviamente, cero. Utilice la siguiente secuencia de comandos de R:

f <- function(x, y)
{
    d <- data.frame(x=x, y=y)
    d <- d[order(x),]
    r <- data.frame(k=rep(0,length(x)-4), sums=rep(0,length(x)-4))

    plm <- function(i)
    {
        d1 <- head(d,i)
        d2 <- tail(d,-i)

        # Make sure we've divided the region perfectly        
        stopifnot(nrow(d1)+nrow(d2) == nrow(d))

        m1 <- lm(y~x, data=d1)
        m2 <- lm(y~x, data=d2)

        r <- list(m1, m2)
        r
    }

    lapply(2:(nrow(d)-3), function(i)
    {
        r$k[i-2] <<- d[i,]$x

        # Fit two piecewise linear models
        m <- plm(i)

        # Add up the sum of squares for residuals
        r$sums[i-2] <<- sum((m[[1]]$residuals)^2) + sum((m[[2]]$residuals)^2)
    })

    b <- r[which.min(r$sums),]    
    b
}

Ajuste de un modelo lineal por tramos de modelos para todas las combinaciones posibles:

f(x,y)
   k sums
   0    0

Si revisamos los coeficientes de las dos óptimo de los modelos, que va a ser muy importante. Su R2 será también muy alta.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X