Вопрос

Мой набор данных довольно большой, поэтому я использую только 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  
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top