Линейная регрессия с известным фиксированным перехватом в R
Я хочу рассчитать линейную регрессию с использованием функции lm() в R. Кроме того, я хочу получить наклон регрессии, где я явно передаю перехват lm()
.
Я нашел пример в Интернете, и я попытался прочитать R-help "? lm" (к сожалению, я не могу это понять), но мне это не удалось. Может ли кто-нибудь сказать мне, где моя ошибка?
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 за вашу помощь.
Ответы
Ответ 1
Вы можете вычесть явный перехват из регрессии и затем установить модель без перехвата:
> intercept <- 1.0
> fit <- lm(I(x - intercept) ~ 0 + y, lin)
> summary(fit)
0 +
подавляет установку перехвата на lm
.
изменить. Чтобы построить график, используйте
> abline(intercept, coef(fit))
P.S. Переменные в вашей модели выглядят неверно: обычно y ~ x
, а не x ~ y
(т.е. Регрессия и должна идти слева и регресс справа).
Ответ 2
Я вижу, что вы приняли решение с помощью I(). Я подумал, что решение на основе offset() было бы более очевидным, но вкусы меняются, и после работы через офсетное решение я могу оценить экономию решения 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))
Ответ 3
Я использовал и смещение, и I(). Я также считаю, что смещение легче работать (например, BondedDust), так как вы можете установить перехват.
Предполагая, что перехват - 10.
plot (lin$x, lin$y)
fit <-lm(lin$y~0 +lin$x,offset=rep(10,length(lin$x)))
abline(fit,col="blue")