47 votes

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'intercept à lm() .

J'ai trouvé un exemple sur internet et j'ai essayé de lire l'aide R "?lm" (malheureusement je ne suis pas capable de la comprendre), mais je n'ai pas réussi. Quelqu'un peut-il me dire où se trouve 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.

50voto

NPE Points 169956

Vous pourriez soustraire l'intercept explicite du régressand et ensuite ajuster le modèle sans intercept :

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

El 0 + supprime l'ajustement de l'intercept par lm .

modifier Pour tracer l'ajustement, utilisez

> abline(intercept, coef(fit))

P.S. Les variables de votre modèle sont à l'envers : c'est généralement y ~ x pas x ~ y (c'est-à-dire que le régresseur doit aller à gauche et le(s) régresseur(s) à droite).

22voto

BondedDust Points 105234

Je vois que vous avez accepté une solution 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))

0voto

stats_lover Points 19

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X