Regressione lineare con vincolo di pendenza


18

Voglio eseguire una regressione lineare molto semplice in R. La formula è semplice come . Tuttavia, vorrei che la pendenza ( ) fosse all'interno di un intervallo, diciamo, tra 1.4 e 1.6.y=un'X+Bun'

Come si può fare?

Risposte:


24

Voglio eseguire ... regressione lineare in R. ... Vorrei che la pendenza fosse all'interno di un intervallo, diciamo, tra 1.4 e 1.6. Come si può fare?

(i) Modo semplice:

  • adattarsi alla regressione. Se è nei limiti, il gioco è fatto.

  • Se non è compreso nei limiti, impostare la pendenza sul limite più vicino e

  • stimare l'intercetta come media di su tutte le osservazioni.(y-un'X)

(ii) Modo più complesso: eseguire i minimi quadrati con vincoli di riquadro sulla pendenza; molte routine di ottimizzazione implementano vincoli box, ad esempio nlminb(che viene fornito con R).

Modifica: in realtà (come menzionato nell'esempio seguente), in vanilla R, è nlspossibile eseguire vincoli box; come mostrato nell'esempio, è davvero molto facile da fare.

È possibile utilizzare la regressione vincolata in modo più diretto; Penso che la pclsfunzione del pacchetto "mgcv" e la nnlsfunzione del pacchetto "nnls" lo facciano entrambe.

-

Modifica per rispondere alla domanda di follow-up -

Stavo per mostrarti come usarlo nlminbdal momento che viene fornito con R, ma mi sono reso conto che nlsutilizza già le stesse routine (le routine PORT) per implementare i minimi quadrati vincolati, quindi il mio esempio qui sotto fa questo caso.

NB: nel mio esempio di seguito, è l'intercetta eb è la pendenza (la convenzione più comune nelle statistiche). Mi sono reso conto dopo averlo inserito qui che hai iniziato il contrario; Però lascerò l'esempio "arretrato" relativo alla tua domanda.un'B

Innanzitutto, imposta alcuni dati con la pendenza "vera" all'interno dell'intervallo:

 set.seed(seed=439812L)
 x=runif(35,10,30)
 y = 5.8 + 1.53*x + rnorm(35,s=5)  # population slope is in range
 plot(x,y)
 lm(y~x)

Call:
lm(formula = y ~ x)

Coefficients:
(Intercept)            x  
     12.681        1.217  

... ma la stima LS è ben al di fuori di essa, causata solo da variazioni casuali. Quindi, consente di utilizzare la regressione vincolata in nls:

 nls(y~a+b*x,algorithm="port",
   start=c(a=0,b=1.5),lower=c(a=-Inf,b=1.4),upper=c(a=Inf,b=1.6))

Nonlinear regression model
  model: y ~ a + b * x
   data: parent.frame()
    a     b 
9.019 1.400 
 residual sum-of-squares: 706.2

Algorithm "port", convergence message: both X-convergence and relative convergence (5)

Come vedi, ottieni una pendenza proprio sul confine. Se si passa il modello adattato a summaryesso produrrà anche errori standard e valori t, ma non sono sicuro di quanto siano significativi / interpretabili.

y-BX

 b=1.4
 c(a=mean(y-x*b),b=b)
       a        b 
9.019376 1.400000

È la stessa stima ...

Nel grafico seguente, la linea blu è i minimi quadrati e la linea rossa è i minimi quadrati vincolati:

linea vincolata e LS


Grazie per questa risposta ma ... potresti fare un esempio usando una di queste funzioni?
Iñigo Hernáez Corres,

1
+1 Trovare intervalli di confidenza sulle stime dei parametri sarà una sfida in ogni caso.
whuber

@ IñigoHernáezCorres vede l'aggiornamento alla mia risposta, dove illustrerò come usarlo nls.
Glen_b -Restate Monica

+1 ottima risposta con connessioni su due modi per farlo!
Haitao Du,

15

Il secondo metodo di Glen_b, che utilizza i minimi quadrati con un vincolo di riquadro, può essere implementato più facilmente tramite la regressione della cresta. La soluzione per la cresta della regressione può essere vista come il Lagrangiano per una regressione con un limite all'ampiezza della norma del vettore di peso (e quindi alla sua pendenza). Quindi, seguendo i suggerimenti di Whuber di seguito, l'approccio sarebbe quello di sottrarre una tendenza di (1,6 + 1,4) / 2 = 1,5 e quindi applicare la regressione della cresta e aumentare gradualmente il parametro della cresta fino a quando l'ampiezza della pendenza è inferiore o uguale a 0,1.

Il vantaggio di questo approccio è che non sono richiesti strumenti di ottimizzazione fantasiosi, solo ridgeon regresson, che è già disponibile in R (e in molti altri pacchetti).

Tuttavia la semplice soluzione di Glen_b (i) mi sembra sensata (+1)


5
È intelligente, ma sei sicuro che funzionerà come descritto? Mi sembra che l'approccio appropriato sarebbe quello di rimuovere una tendenza di (1.6 + 1.4) / 2 = 1.5 e quindi controllare il parametro di cresta fino a quando il valore assoluto della pendenza è inferiore o uguale a 0,1.
whuber

1
sì, questo è davvero un suggerimento migliore. L'approccio della regressione della cresta è davvero più appropriato se la restrizione è sull'entità della pendenza, sembra un problema piuttosto strano! La mia risposta è stata originariamente ispirata dal commento di Glen_b sui vincoli del riquadro, la regressione della cresta è fondamentalmente solo un modo più semplice per implementare i vincoli del riquadro.
Dikran Marsupial,

Anche se apprezzo il tuo riconoscimento dei miei commenti, imho che distrae dal contenuto della tua risposta. Siamo tutti insieme per migliorare il nostro lavoro ovunque possiamo, quindi è sufficiente il riconoscimento che tu abbia dato seguito ai miei suggerimenti. Per questo ti meriti l'incremento della reputazione. Se vieni spostato per apportare ulteriori modifiche, considera di semplificare il testo rimuovendo quel materiale superfluo.
whuber

Materiale superfluo curato, tuttavia mi piacciono le collaborazioni e cerco sempre di dare ai collaboratori il merito che meritano, e penso ancora moralmente che tu meriti la metà dei voti positivi. ; o)
Dikran Marsupial,

10

un'

un'

Questo risultato fornirà comunque intervalli credibili dei parametri di interesse (ovviamente la significatività di questi intervalli si baserà sulla ragionevolezza delle informazioni precedenti sulla pendenza).


+1, questo è stato anche il mio primo pensiero. Mi piacciono gli altri suggerimenti, ma questo mi sembra il migliore.
gung - Ripristina Monica

0

Un altro approccio potrebbe essere quello di riformulare la regressione come problema di ottimizzazione e utilizzare un ottimizzatore. Non sono sicuro che possa essere riformulato in questo modo, ma ho pensato a questa domanda quando ho letto questo post sul blog sugli ottimizzatori R:

http://zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html

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.