Использование смещения в lm-регрессии — R

у меня есть этот код

dens <- read.table('DensPiu.csv', header = FALSE)
fl <- read.table('FluxPiu.csv', header = FALSE)
mydata <- data.frame(c(dens),c(fl))

dat = subset(mydata, dens>=3.15)
colnames(dat) <- c("x", "y")
attach(dat)

и я хотел бы выполнить регрессию методом наименьших квадратов для данных, содержащихся в dat, функция имеет вид

y ~ a + b*x

и я хочу, чтобы линия регрессии проходила через определенную точку P(x0,y0) (которая не является источником).

Я пытаюсь сделать это так

 x0 <- 3.15 

 y0 <-283.56

 regression <- lm(y ~ I(x-x0)-1, offset=y0)

(Я думаю, что data = dat в этом случае не нужен), но я получаю эту ошибку:

Error in model.frame.default(formula = y ~ I(x - x0) - 1, : variable
 lengths differ (found for '(offset)').

Я не знаю почему. Я предполагаю, что я неправильно определил значение смещения, но я не смог найти ни одного примера в Интернете.

Может кто-нибудь объяснить мне, как работает offset?


r lm
person ac2051    schedule 04.06.2013    source источник
comment
Можете ли вы привести воспроизводимый пример с данными, пожалуйста?   -  person joran    schedule 04.06.2013
comment
В чем разница между этим вопросом и вашим предыдущим, пожалуйста?   -  person agstudy    schedule 04.06.2013
comment
Теперь я прошу определить объект, который находится в смещении. Мой предыдущий вопрос был о том, как сделать регрессию, проходящую для определенной точки.   -  person ac2051    schedule 04.06.2013
comment
Файлы справки говорят, что это должен быть вектор, а не константа: this can be used to specify an a priori known component to be included in the linear predictor during fitting. This should be NULL or a numeric vector of length equal to the number of cases. One or more offset terms can be included in the formula instead or as well, and if more than one are specified their sum is used. See model.offset.   -  person Thomas    schedule 04.06.2013
comment
Что ж, тут есть очень веский аргумент, что не стоило задавать второй вопрос. Вопросы на StackOverflow должны быть полностью автономными. Вот почему вы получили некоторые комментарии о сходстве между ними, поскольку некоторые люди (справедливо) думали, что вы должны были просто отредактировать это в своем предыдущем вопросе.   -  person joran    schedule 04.06.2013
comment
в защиту ОП, я думаю, что это немного суждение - я согласен, что в этом случае было бы лучше отредактировать предыдущий вопрос, но я могу представить довольно похожий сценарий, когда кого-то могут разжевать для редактирования и не публиковать как отдельный вопрос...   -  person Ben Bolker    schedule 04.06.2013
comment
Спасибо. Я задал этот вопрос в комментарии к предыдущему, но никто не ответил. Так как это совершенно отдельная тема (использование offset, а не регрессия, проходящая через точку), я подумал, что ее можно рассматривать отдельно.   -  person ac2051    schedule 04.06.2013
comment
@ Томас Я уже прочитал файл справки, но не мог его понять. В частности, я не понял, что они имеют в виду под случаями, когда говорят длина равна количеству случаев..   -  person ac2051    schedule 04.06.2013


Ответы (2)


Термин смещения должен быть переменной, например x и y, а не числовой константой. Поэтому вам нужно создать столбец в вашем наборе данных с соответствующими значениями.

dat$o <- 283.56
lm(y ~ I(x - x0) - 1, data=dat, offset=o)
person Hong Ooi    schedule 04.06.2013
comment
Спасибо за Ваш ответ. Я добавил точку P(x0,y0) в свою базу данных. Теперь это 161 элемент dat. Я пробовал и x0 <- 3.15 y0 <- dat[161,2] regression <- lm(y ~ I(x-x0)-1, offset=y0), и этот y0 <- dat[161,] regression <- lm(y ~ I(x)-1, offset=y0), но ни один из них не работает. Что я делаю неправильно? Я добавил первую часть кода к моему вопросу, чтобы сделать его более понятным. - person ac2051; 04.06.2013
comment
Вы по-прежнему создаете одну константу с заданным значением. Вам нужно передать вектор значений в качестве смещения. Самый простой способ сделать это, как я уже писал: создать новый столбец в вашем наборе данных. Я предполагаю, что dat[161, 2] - это то, чем должен быть ваш y0? Сделайте это: dat$o <- dat[161,2]; lm(y ~ I(x - x0) - 1, offset=o, data=dat) - person Hong Ooi; 04.06.2013
comment
Идеально, большое спасибо! Я создал строку вместо столбца, поэтому это не сработало! Спасибо за терпеливость. - person ac2051; 04.06.2013
comment
Правильно ли использовать I(x - x0)? Модель предполагает нормальное распределение остатков по x-x0, что не всегда может быть так. И проблема будет хуже, если x и x0 коррелированы. Я тоже не знаю, как смещение влияет на фитинг. И из справки glm: «Нулевая модель будет включать смещение и точку пересечения, если она есть в модели. Обратите внимание, что это будет неверным, если функция связи зависит от данных, отличных от подогнанного среднего значения: укажите нулевое смещение, чтобы обеспечить правильный расчет. - person skan; 14.05.2017

Фактически, реальная проблема здесь заключается в том, что вы должны указать offset с вектором, длина которого такая же, как количество строк (или длина, если данные составлены в виде вектора) ваших данных. Следующий код выполнит вашу работу, как и ожидалось:

regression <- lm(y ~ I(x-x0)-1, offset = rep(y0, length(y))

Вот хорошее объяснение для интересующихся: http://rfunction.com/archives/223

person Liang Zhang    schedule 31.01.2018