Взвешенные наименьшие квадраты в R
-
21-12-2019 - |
Вопрос
Мой набор данных довольно большой, поэтому я использую только 10 строк данных в качестве примера (я разработал ответ в Excel, но не могу воспроизвести его в R, так как мне нужна помощь с кодом):
constant<-c(6.10,5.12,5.04,4.97,4.89,4.89,4.87,4.87,4.88,4.99)
years.star<-c(219.87,153.69,146.19,139.35,127.27,127.27,121.91,121.91,112.28,99.98)
years.sq.star<-c(7915.41,4610.71,4239.78,3901.93,3309.27,3309.27,3047.95,3047.95,2582.58,1999.62)
ln.salary<-c(28.43,23.12,21.59,21.44,22.71,23.33,20.29,21.76,21.48,22.92)
try<-data.frame(constant,years.star,years.sq.star,ln.salary)
Ln.salary — зависимая переменная.Ответ, который вы должны получить:
intercept- 6.474922
beta1- -0.15026
beta2- 0.002769
Моя проблема в том, что в R, если я использую функцию lm, он не знает, что мой перехват имеет значения, указанные выше.он просто использует 1,1,1,1,1,1,1,1,1,1 вместо 6.10,5.12 и т. д.
Так test<-lm(ln.salary~years.star+years.sq.star,data=try,weights=constant)
не работает, потому что он просто сгенерирует этот ответ:
intercept- 207.1706
beta1- -3.13214
beta2- 0.064416
По сути, я взял данные и попытался учесть гетероскедастичность.На последнем этапе у меня есть постоянная звезда и преобразованные переменные x.Последний шаг — регрессировать ln.salary по константе и переменным x, чтобы дать мне ответ, который вы должны получить, как указано выше.
Я могу сделать это в Excel, но не в R, и я знаю, что неправильно понимаю код.Я знаю, что проблема в функции lm, которая генерирует перехват (1,1,1...).Пожалуйста, не могли бы вы помочь.
С уважением d
Решение
Если вам нужны разные «перехваты» для каждой строки, вам нужно использовать «смещение», а не «вес»:
test<-lm(ln.salary~years.star+years.sq.star+0,data=try,offset=constant)
Call:
lm(formula = ln.salary ~ years.star + years.sq.star + 0, data = try,
offset = constant)
Coefficients:
years.star years.sq.star
0.236355 -0.003881
Меня не очень впечатляет тот факт, что это не согласуется с Excel.Программа линейной регрессии этой программы, как известно, довольно ненадежна.Если, с другой стороны, вы уверены, что вам нужно использовать веса, вам следует уточнить, какая из трех возможных интерпретаций термина используется.(Варианты:репликация, выборка, обратная дисперсия).А lm
интерпретация «веса» представляет собой версию обратной дисперсии.(На странице справки он описан как «обратно пропорционален дисперсии»), поэтому, если эти «постоянные» термины являются дисперсиями, то, возможно, вы захотите:
> (test<-lm(ln.salary~years.star+years.sq.star+0, data=try, weights=1/constant) )
Call:
lm(formula = ln.salary ~ years.star + years.sq.star + 0, data = try,
weights = 1/constant)
Coefficients:
years.star years.sq.star
0.309391 -0.005189
Другие советы
Если вы хотите «зафиксировать» перехват на определенной константе, вам следует вычесть значение этой константы из ответа, а затем подогнать модель без перехвата.Например
test <- lm( ln.salary - 6.474922 ~ years.star + years.sq.star + 0,
data=try, weights=constant)
Здесь мы вычитаем член перехвата, а затем добавляем +0
в формулу, чтобы указать, что она не соответствует члену.С этой моделью я получаю
Call:
lm(formula = ln.salary - 6.474922 ~ years.star + years.sq.star +
0, data = try, weights = constant)
Coefficients:
years.star years.sq.star
0.197384 -0.002842