Eseguire la regressione lineare, ma forzare la soluzione a passare attraverso alcuni punti dati particolari


14

So eseguire una regressione lineare su una serie di punti. Cioè, so come adattare un polinomio di mia scelta a un dato set di dati (nel senso di LSE). Tuttavia, ciò che non so è come forzare la mia soluzione a passare attraverso alcuni punti particolari della mia scelta. L'ho già visto prima, ma non ricordo come si chiamava la procedura, figuriamoci come è stata fatta.

Come esempio molto semplice e concreto, diciamo che ho 100 punti sparsi sul piano xy e ho scelto di inserirvi un polinomio di qualunque ordine. So eseguire molto bene questa regressione lineare. Tuttavia, diciamo che voglio "forzare" la mia soluzione, per passare attraverso, diciamo, tre dei miei punti dati in coordinate , e , (e le corrispondenti coordinate y ovviamente).x = 19 x = 89x=3x=19x=89

Come si chiama questa procedura generale, come viene eseguita e ci sono alcune insidie ​​particolari di cui devo essere consapevole?

Modificare:

Vorrei aggiungere che sto cercando un modo concreto per farlo. Ho scritto un programma che esegue la regressione lineare in due modi, invertendo direttamente la matrice di covarianza o attraverso la discesa del gradiente. Quello che sto chiedendo è, come, esattamente, passo dopo passo, modificare ciò che ho fatto, in modo tale da forzare la soluzione polinomiale a passare attraverso punti specifici?

Grazie!


Perché lo chiami "lineare" se stai usando un polinomio? Ogni punto che vuoi attraversare è un vincolo che ridurrà il tuo grado di libertà. È quindi possibile utilizzare un algoritmo di ottimizzazione vincolato.
curious_cat,

4
È lineare perché stai trovando coefficienti per una combinazione lineare . Ad esempio, se si desidera adattare i propri dati a un cubo, allora si trovano i coefficienti (la 's) di . y = c 0 + c 1 x + c 2 x 2 + c 3 x 3cy=c0+c1x+c2x2+c3x3
Spacey,

1
@Mohammad: un altro modo per approssimare quello che vuoi sarebbe usare una soluzione dei minimi quadrati ponderati e dare pesi molto grandi ai punti che vuoi far passare attraverso la linea di regressione. Ciò dovrebbe costringere la soluzione a passare molto da vicino ai punti scelti.
Jason R,

@JasonR Piacere di vederti qui. Sì, WLS è davvero un contendente interessante. Sono andato con la risposta dei whubers a causa della fattorizzazione polinomiale intelligente e perché mantiene bene la struttura dell'errore.
Spacey,

Risposte:


19

Il modello in questione può essere scritto

y=p(x)+(xx1)(xxd)(β0+β1x++βpxp)+ε

dove è un polinomio di grado d - 1 che passa attraverso punti predeterminati ( x 1 , y 1 ) , , ( x d , y d ) e ε è casuale. (Usa il polinomio interpolante di Lagrange .) Scrittura ( x - x 1 ) ( x - x d ) = rp(xi)=yid1(x1,y1),,(xd,yd)ε ci consente di riscrivere questo modello come(xx1)(xxd)=r(x)

yp(x)=β0r(x)+β1r(x)x+β2r(x)x2++βpr(x)xp+ε,

che è un problema di regressione multipla OLS standard con la stessa struttura di errore dell'originale in cui le variabili indipendenti sono le quantità r ( x ) x i , i = 0 , 1 , , p . Calcola semplicemente queste variabili ed esegui il tuo software di regressione familiare , assicurandoti di evitare che includa un termine costante. Si applicano le solite avvertenze sulle regressioni senza un termine costante; in particolare, l' R 2 può essere artificialmente alto; le solite interpretazioni non si applicano.p+1r(x)xi, i=0,1,,pR2

(In effetti, la regressione attraverso l'origine è un caso speciale di questa costruzione in cui , ( x 1 , y 1 ) = ( 0 , 0 ) e p ( x ) = 0 , in modo che il modello sia y = β 0 x + + β p x p + 1 + ε . )d=1(x1,y1)=(0,0)p(x)=0y=β0x++βpxp+1+ε.


Ecco un esempio funzionante (in R)

# Generate some data that *do* pass through three points (up to random error).
x <- 1:24
f <- function(x) ( (x-2)*(x-12) + (x-2)*(x-23) + (x-12)*(x-23) )  / 100
y0 <-(x-2) * (x-12) * (x-23) * (1 + x - (x/24)^2) / 10^4  + f(x)
set.seed(17)
eps <- rnorm(length(y0), mean=0, 1/2)
y <- y0 + eps
data <- data.frame(x,y)

# Plot the data and the three special points.
plot(data)
points(cbind(c(2,12,23), f(c(2,12,23))), pch=19, col="Red", cex=1.5)

# For comparison, conduct unconstrained polynomial regression
data$x2 <- x^2
data$x3 <- x^3
data$x4 <- x^4

fit0 <- lm(y ~ x + x2 + x3 + x4, data=data)
lines(predict(fit0), lty=2, lwd=2)

# Conduct the constrained regressions
data$y1 <- y - f(x)
data$r <- (x-2)*(x-12)*(x-23)
data$z0 <- data$r
data$z1 <- data$r * x
data$z2 <- data$r * x^2

fit <- lm(y1 ~ z0 + z1 + z2 - 1, data=data)
lines(predict(fit) + f(x), col="Red", lwd=2)

Tracciare

I tre punti fissi sono visualizzati in rosso fisso: non fanno parte dei dati. L'accoppiamento polinomiale dei minimi quadrati non vincolato del quarto ordine è mostrato con una linea tratteggiata nera (ha cinque parametri); l'adattamento vincolato (dell'ordine di cinque, ma con solo tre parametri liberi) è mostrato con la linea rossa.

Ispezionare l'output dei minimi quadrati ( summary(fit0)e summary(fit)) può essere istruttivo - lascio questo al lettore interessato.


βr(x)xixir(x)

Ho aggiunto un esempio funzionante, Mohammad.
whuber

Oh perfetto Lo studierò. Utilizzando il tuo esempio, sarebbe comunque possibile forzare il poli a passare attraverso i punti che fanno parte dei dati, giusto?
Spacey,

Assolutamente si può fare: ma sii doppiamente cauto nell'interpretare i valori p o qualsiasi altra statistica, perché ora i tuoi vincoli si basano sui dati stessi.
whuber

Il tuo post mi ha fatto alzare ieri sera. Mi sono insegnato il LIP. (LIP è interessante. È come una decomposizione di Fourier ma con polis).
Spacey,

9

(xi,yi)xixyiy

Se vuoi forzare una linea a passare attraverso due punti in un piano XY, è anche abbastanza facile da fare. Due punti possono essere adattati con una linea. È possibile utilizzare la formula punto-pendenza per calcolare la pendenza, quindi utilizzare uno dei punti, la pendenza e l' equazione di una linea per trovare l'intercetta.

XX2


Mi sento in dovere di menzionare a questo punto, tuttavia, che questa potrebbe non essere una grande cosa da fare (a meno che la tua teoria non fornisca ragioni molto solide per farlo). Potresti anche voler esaminare la regressione bayesiana , dove puoi consentire al tuo modello di trovare la migliore combinazione delle informazioni nei tuoi dati e alcune informazioni precedenti (che potresti usare per distorcere fortemente l'intercettazione verso zero, ad esempio, senza forzandolo).


1
xiyi

2
Anche se aggiungere altri tre punti e ponderarli ( la risposta di la Glen_b) potrebbe creare un tale adattamento, interpretare qualsiasi risultato statistico sarebbe problematico: sarebbero necessari alcuni aggiustamenti.
whuber

6

Per aggiungere un po 'di informazioni in più all'eccellente copertura del caso lineare di @ gung, nel caso polinomiale di ordine superiore ci sono diversi modi in cui puoi farlo esattamente o approssimativamente (ma praticamente esattamente quanto ti serve).

Innanzitutto, si noti che i gradi di libertà per il polinomio (o addirittura per qualsiasi funzione adattata) devono essere almeno pari al numero di punti "noti". Se i gradi di libertà sono uguali, non sono necessari affatto i dati, poiché la curva è completamente determinata. Se ci sono più punti "conosciuti" non è possibile risolverlo (a meno che non si trovino tutti esattamente sullo stesso polinomio del grado specificato, nel qual caso sarà sufficiente un sottoinsieme di dimensioni adeguate). Da qui in poi, parlerò solo di quando il polinomio ha più df dei punti noti (come un cubo - con 4df - e tre punti noti, in modo che il cubo non sia né eccessivamente determinato da punti noti né completamente determinato da loro) .

1) "la curva deve passare attraverso questo punto" è un vincolo lineare sui parametri, con conseguente stima vincolata o minimi quadrati vincolati (sebbene entrambi i termini possano includere altre cose oltre ai vincoli lineari, come i vincoli di positività). È possibile incorporare vincoli lineari con entrambi

  (a) rifusione della parametrizzazione per includere implicitamente ogni vincolo risultante in un modello di ordine inferiore.

  (b) utilizzando strumenti standard che possono incorporare vincoli lineari sui parametri di un adattamento dei minimi quadrati. (di solito tramite qualcosa come la formula fornita al link sopra)

2) Un altro modo è attraverso la regressione ponderata. Se dai ai punti noti un peso sufficientemente grande, puoi ottenere sostanzialmente la stessa misura di (1). Questo è spesso facilmente implementato, può essere sostanzialmente più veloce della ricomparificazione, e può essere fatto in pacchetti che non offrono adattamenti vincolati.

Si applicano tutte le avvertenze di @ gung


Glen_b, non avevo considerato la regressione ponderata. Potrebbe essere il modo di procedere. L'ho inserito nella mia lista delle cose da fare. Credo di potermelo insegnare senza incidenti. Per quanto riguarda (1), potresti gentilmente estendere questo aspetto della paramaterizzazione? Inoltre, come si chiama ciò che sto cercando di fare, dove forzo il polinomio a passare determinati punti? Parte del problema è che non so cosa cercare su Google. Se so come si chiamava, potrei essere in grado di aumentare quello che stai dicendo con materiale online. Grazie.
Spacey,

Vedi le mie modifiche sopra, che includono alcuni termini di ricerca e un link con qualche dettaglio in più.
Glen_b -Restate Monica

2
+1 La regressione ponderata è una buona idea. Potrebbe essere necessario un aggiustamento delle statistiche di output, come le stime dell'errore RMS.
whuber

s2FR2

Grazie per la tua risposta Glen_b, anche se ho accettato quelle di @whuber, ho comunque imparato molto dalla tua.
Spacey,
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.