Подтвердить что ты не робот

Линейная регрессия с известным фиксированным перехватом в 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 за вашу помощь.

4b9b3361

Ответ 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")