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

3 ответов


вы можете вычесть явный Перехват из регрессанда, а затем соответствовать модели без перехвата:

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

на 0 + подавляет установку перехвата lm.

редактировать для построения подгонки используйте

> abline(intercept, coef(fit))

С. П. переменных в вашей модели выглядеть не так: обычно y ~ x, а не x ~ y (т. е. регресс и должен идти слева, а регрессор(ы) справа).


Я вижу, что вы приняли решение, используя I(). Я думал, что решение на основе offset () было бы более очевидным, но вкусы различаются, и после работы с решением 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))

я использовал как offset, так и 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")