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.
Come si può fare?
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.
Come si può fare?
Risposte:
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.
(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, è nls
possibile eseguire vincoli box; come mostrato nell'esempio, è davvero molto facile da fare.
È possibile utilizzare la regressione vincolata in modo più diretto; Penso che la pcls
funzione del pacchetto "mgcv" e la nnls
funzione del pacchetto "nnls" lo facciano entrambe.
-
Modifica per rispondere alla domanda di follow-up -
Stavo per mostrarti come usarlo nlminb
dal momento che viene fornito con R, ma mi sono reso conto che nls
utilizza 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.
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 summary
esso produrrà anche errori standard e valori t, ma non sono sicuro di quanto siano significativi / interpretabili.
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:
nls
.
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)
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).
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