web-dev-qa-db-fra.com

Régression linéaire avec une interception fixe connue dans R

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

J'ai trouvé un exemple sur Internet et j'ai essayé de lire l'aide R "? Lm" (malheureusement je ne peux pas le comprendre), mais je n'y suis pas parvenu. 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")

Merci pour votre aide.

34
R_User

Vous pouvez soustraire l'interception explicite de la régression et ensuite ajuster le modèle sans interception:

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

Le 0 + supprime l'ajustement de l'ordonnée à l'origine par lm.

edit Pour tracer l'ajustement, utilisez

> abline(intercept, coef(fit))

P.S. Les variables de votre modèle sont inversées: c'est généralement y ~ x, ne pas x ~ y (c'est-à-dire que la régression doit aller à gauche et le ou les régresseurs à droite).

38
NPE

Je constate 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
42-

J'ai utilisé à la fois offset et I (). Je trouve également que l'offset est plus facile à utiliser (comme BondedDust) car vous pouvez définir votre interception.

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
stats_lover