2011-09-07 19 views
28

Quiero calcular una regresión lineal utilizando la función lm() en R. Además, quiero obtener la pendiente de una regresión, donde explico explícitamente la intercepción en lm().Regresión lineal con una intercepción fija conocida en R

Encontré un ejemplo en Internet y traté de leer la R-help "? Lm" (desafortunadamente no lo entiendo), pero no tuve éxito. ¿Alguien puede decirme dónde está mi error?

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

Gracias por su ayuda.

Respuesta

33

Se podría restar la intersección explícita del regressand y luego ajustar el modelo libre de intersección:

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

El 0 + suprime la instalación de la intersección por lm.

edición Para representar gráficamente el ajuste, utilice

> abline(intercept, coef(fit)) 

P. S. Las variables en su modelo se ven de forma incorrecta: generalmente es y ~ x, no x ~ y (es decir, las regresas deben ir a la izquierda y las regresoras a la derecha).

+3

o 'I (x - 1,0) ~ y-1' surpresses el montaje de la intersección también. –

+2

@Joris Meys: Sí. Yo creo que las dos formas son sinónimos. Elegí la otra forma de evitar tener dos términos '-1' y tener que explicar cuál es cuál. – NPE

+0

Pero cuando trazo la curva de curva de regresión (regExp, col = "green"), no pasa por 1. No he descubierto cómo extraer la pendiente (y/o intersección) de la salida lm. Para mí, parece que siempre debe conocer la posición de los valores en el coef-array, y luego extraer en (y esperar que la posición sea correcta). Entonces, ¿el siguiente código es la "forma de oro" para trazar la curva de regresión correcta? 'abline (b = coef (regExp) [1], a = explicitIntercept, col =" green ")' –

13

Veo que ha aceptado una solución usando I(). Yo había pensado que una solución basada en offset() habría sido más obvio, pero los gustos varían y después de trabajar a través de la solución de desplazamiento que se puede apreciar la economía de la I() solución:

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

he utilizado tanto compensado y yo(). También considero que es más fácil trabajar con compensación (como BondedDust) ya que puedes configurar tu intercepto.

Suponiendo Intercepción es 10.

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

Cuestiones relacionadas