Régression linéaire avec une ordonnée à l'Origine fixe connue en R

<!-Je veux calculer une régression linéaire en utilisant la fonction lm () dans R. en plus je veux obtenir la pente d'une régression, où je donne explicitement l'ordonnée à l'origine à lm().

j'ai trouvé un exemple sur internet et j'ai essayé de lire le R-help "?lm" (malheureusement je ne suis pas capable de le comprendre), mais je n'ai pas réussi. Quelqu'un peut-il me dire où est mon erreur?

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")

Thanls pour votre aide.

30
demandé sur 李哲源 2011-09-07 15:38:15

3 réponses

vous pouvez soustraire l'ordonnée à l'origine explicite de la régression et ensuite ajuster le modèle sans ordonnée à l'origine:

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

0 + supprime la mise en place de l'intercept par lm.

modifier pour tracer la correspondance, utilisez

> abline(intercept, coef(fit))
y ~ x, pas x ~ y (c'est-à-dire que le régresseur doit aller à gauche et le ou les régresseurs à droite).

35
répondu NPE 2011-09-07 12:52:59

je vois que vous avez accepté une solution en utilisant I(). J'avais pensé qu'une solution basée sur offset() aurait été plus évidente, mais les goûts varient et après avoir travaillé sur la solution offset, je peux apprécier l'économie de la solution I ():

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))
14
répondu 42- 2014-05-26 20:15:39

j'ai utilisé à la fois offset et I(). Je trouve aussi l'offset plus facile à utiliser (comme BondedDust) puisque vous pouvez régler votre intercept.

en supposant que L'interception est de 10.

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

1
répondu stats_lover 2015-10-18 07:45:25