Trovare il punto di cambio nei dati da una funzione lineare a tratti


10

Saluti,

Sto effettuando ricerche che aiuteranno a determinare le dimensioni dello spazio osservato e il tempo trascorso dal big bang. Spero che tu possa aiutare!

Ho dati conformi a una funzione lineare a tratti su cui voglio eseguire due regressioni lineari. C'è un punto in cui la pendenza e l'intercettazione cambiano, e devo (scrivere un programma per) trovare questo punto.

Pensieri?


3
Qual è la politica sul cross-posting? La stessa identica domanda è stata posta su math.stackexchange.com: math.stackexchange.com/questions/15214/…
mpiktas il

Cosa c'è di sbagliato nel fare semplici minimi quadrati non lineari in questo caso? Mi sto perdendo qualcosa di ovvio?
sabato

Direi che la derivata della funzione obiettivo rispetto al parametro del punto di cambio è piuttosto non uniforme
Andre Holzner,

La pendenza cambierebbe così tanto che i minimi quadrati non lineari non sarebbero concisi e precisi. Quello che sappiamo è che abbiamo due o più modelli lineari, quindi dovremmo colpire per estrarre quei due modelli.
HelloWorld,

Risposte:


1

Il mcppacchetto può farlo. Di 'i tuoi dati

Innanzitutto, simuliamo alcuni dati:

df = data.frame(x = 1:100,
                y = c(rnorm(40, 10 + (1:40)*0.5),
                      rnorm(60, 10 + 40*0.5 -8 + (1:60)*0.2)))

Ora vediamo se riusciamo a recuperare il punto di cambio a 40 (e i valori dei parametri) usando mcp:

model = list(
  y ~ 1 + x,  # linear segment
  ~ 1 + x  # another linear segment
)
library(mcp)
fit = mcp(model, df)

Traccialo. Le linee grigie sono disegni casuali dall'adattamento, dimostrando che cattura la tendenza. La curva blu è la posizione stimata del punto di variazione:

inserisci qui la descrizione dell'immagine

Vediamo le stime dei singoli parametri. int_sono intercettazioni, x_sono pendenze su xe cp_sono punti di cambiamento:

summary(fit)

Population-level parameters:
    name  mean lower upper Rhat n.eff
    cp_1 40.48 40.02 41.00    1  2888
   int_1 11.12  9.11 13.17    1   778
   int_2 21.72 20.09 23.49    1   717
 sigma_1  3.23  2.76  3.69    1  5343
     x_1  0.46  0.36  0.54    1   724
     x_2  0.21  0.16  0.26    1   754

Disclaimer: sono lo sviluppatore di mcp.


8

R pacchetto strucchange potrebbe aiutarti. Guarda la vignetta, ha una bella panoramica su come risolvere problemi simili.


6

Se il numero di punti non è troppo grande, puoi provare tutte le possibilità. Supponiamo che i punti sono dove . Quindi, puoi eseguire il ciclo con da a e adattare due righe a entrambi e . Infine, scegli per cui la somma della somma dei residui quadrati per entrambe le linee è minima.i = 1 , . . , N j 2 N - 2 { X 1 , . . . , X j } { X ( j + 1 ) , . . . , X N } jXi=(xi,yi)i=1,..,Nj2N2{X1,...,Xj}{X(j+1),...,XN}j


Ho pubblicato una risposta basata sul tuo suggerimento semplice ma efficace.
HelloWorld,

5

Questo è un problema di rilevamento del punto di cambio (offline). La nostra precedente discussione fornisce riferimenti ad articoli di riviste e codice R. Guarda prima il "modello di partizione del prodotto" di Barry e Hartigan perché gestisce i cambiamenti di pendenza e ha implementazioni efficienti.


3

Anche il pacchetto segmentato mi ha aiutato con problemi simili in passato.


Sfortunatamente, il pacchetto richiede un valore iniziale per il punto di interruzione.
HelloWorld,

Inoltre, segmentednon è possibile modellare i cambiamenti di intercettazione tra segmenti: solo un'intercettazione per il primo segmento.
Jonas Lindeløv,

2

Ho costruito sulla risposta di mbq che cercavo tutte le possibilità. Inoltre, faccio questo:

  • Verificare la significatività dei due modelli a tratti per assicurarsi che i coefficienti siano significativi
  • Controlla la differenza con la somma dei residui quadrati per il modello completo
  • Conferma visivamente il mio modello (assicurati che non sia una sciocchezza)

Perché verificare il significato? Questo perché il punto con il SSE minimo non ha senso se uno dei modelli a tratti si adatta molto male ai dati. Questo può accadere per due variabili altamente correlate senza un punto di interruzione chiaro dove cambiano le pendenze.

Controlliamo questo semplice approccio con un semplice test case:

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

inserisci qui la descrizione dell'immagine

Il punto di interruzione è ovviamente zero. Utilizzare il seguente script 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
}

Montare modelli lineari a tratti per tutte le possibili combinazioni:

f(x,y)
   k sums
   0    0

Se controlliamo i coefficienti per i due modelli ottimali, saranno altamente significativi. Anche il loro R2 sarà molto alto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.