2011-09-07 14 views
28

Voglio calcolare una regressione lineare utilizzando la funzione lm() in R. Inoltre, voglio ottenere la pendenza di una regressione, in cui fornisco esplicitamente l'intercetta a lm().Regressione lineare con intercetta fissa nota in R

Ho trovato un esempio su Internet e ho provato a leggere l'R-help "? Lm" (purtroppo non sono in grado di capirlo), ma non ci sono riuscito. Qualcuno può dirmi dov'è il mio errore?

lin <- data.frame(x = c(0:6), y = c(0.3, 0.1, 0.9, 3.1, 5, 4.9, 6.2)) 
plot (lin$x, lin$y) 

regImp = lm(formula = lin$x ~ lin$y) 
abline(regImp, col="blue") 

# Does not work: 
# Use 1 as intercept 
explicitIntercept = rep(1, length(lin$x)) 
regExp = lm(formula = lin$x ~ lin$y + explicitIntercept) 
abline(regExp, col="green") 

Grazie per il vostro aiuto.

risposta

33

Si potrebbe sottrarre l'intercetta esplicita dal regressand e poi montare il modello di libera intercetta:

> intercept <- 1.0 
> fit <- lm(I(x - intercept) ~ 0 + y, lin) 
> summary(fit) 

Il 0 + sopprime il montaggio del intercetta da lm.

modificare per tracciare la forma, utilizzare

> abline(intercept, coef(fit)) 

P.S. Le variabili nel tuo modello appaiono nel verso sbagliato: di solito è y ~ x, non x ~ y (vale a dire il regressand dovrebbe andare a sinistra e il regressore (i) a destra).

+3

o 'I (x - 1.0) ~ y-1' surpresses raccordo dell'intercetta pure. –

+2

@Joris Meys: Sì. Credo che i due modi siano sinonimi. Ho scelto l'altro modo per evitare di avere due termini '-1 'e dover spiegare quale è quale. – NPE

+0

Ma quando traccia la curva di regressione ablina (regExp, col = "green"), non passa attraverso 1. Non ho capito come estrarre la pendenza (e/o intercetta) dall'output di lm. Per me sembra che devi sempre conoscere la posizione dei valori nell'array coef e poi estrarre (e sperare che la posizione sia corretta). Quindi, il seguente codice è la "via d'oro" per tracciare la curva di regressione corretta? 'abline (b = coef (regExp) [1], a = explicitIntercept, col =" green ")' –

13

Vedo che hai accettato una soluzione usando I(). Avevo pensato che un offset() soluzione basata sarebbe stato più ovvio, ma i gusti variano e dopo aver lavorato attraverso la soluzione di offset posso apprezzare l'economia del I() Soluzione:

with(lin, plot(y,x)) 
lm_shift_up <- lm(x ~ y +0 + 
         offset(rep(1, nrow(lin))), 
      data=lin) 
abline(1,coef(lm_shift_up)) 
1

Ho usato sia compensata e io(). Trovo anche che l'offset sia più facile con cui lavorare (come BondedDust) poiché è possibile impostare l'intercettazione.

Supponendo intercettazione è 10.

plot (lin$x, lin$y) fit <-lm(lin$y~0 +lin$x,offset=rep(10,length(lin$x))) abline(fit,col="blue")

Problemi correlati