Régression linéaire avec une ordonnée à l'Origine fixe connue en R
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.
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).
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))
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")