Весовые наблюдения в модели spdep::lagsarlm?
Я хотел бы оценить spdep::lagsarlm
Модель (пространственно авторегрессионная регрессия) в R. Мои наблюдения (n=447) - это полигоны, каждый из которых представляет административный район Берлина.
Однако проблема заключается в том, что в регионах проживает очень разное количество жителей (от 500 до 32000). Поэтому я бы хотел сопоставить каждое наблюдение с его количеством жителей. С lm
это просто, потому что он принимает необязательный аргумент weights=
...
Как я могу сделать что-то подобное с spdep::lagsarlm
? Есть ли обходной путь?
1 ответ
Я не использовал spdep::lagsarlm
но очень легко повторить путь lm
использует веса, используя следующий метод:
Давайте предположим, что у вас есть data.frame df
определяется как:
df <- data.frame(a=runif(10), b=runif(10))
> df
a b
1 0.8266429 0.43591733
2 0.4624063 0.93180891
3 0.7085656 0.36468984
4 0.3339251 0.79093356
5 0.8236406 0.39687242
6 0.8266429 0.83213817
7 0.4624063 0.34714824
8 0.7085656 0.01812133
9 0.3339251 0.54498829
10 0.8236406 0.73677156
и вектор весов, определенный как:
c(1,1,1,1,2,2,2,2,2,2)
Работает lm
На основании приведенных данных получаются следующие результаты:
> lm(a~b, data=df, weights=c(1,1,1,1,2,2,2,2,2,2))
Call:
lm(formula = a ~ b, data = df, weights = c(1, 1, 1, 1, 2, 2,
2, 2, 2, 2))
Coefficients:
(Intercept) b
0.6672 -0.0467
Посмотрим теперь, как работает функция lm
на самом деле использует вектор весов.
Мы начнем с репликации строк data.frame df на число, определенное в весах, например:
replicate_rows <- rep(1:nrow(df), c(1,1,1,1,2,2,2,2,2,2))
Строки с весом 2 появляются дважды, как вы можете видеть ниже:
> replicate_rows
[1] 1 2 3 4 5 5 6 6 7 7 8 8 9 9 10 10
Используйте вышеупомянутое, чтобы сделать новый data.frame df2
который использует эти строки:
df2 <- df[replicate_rows, ]
> df2
a b
1 0.8266429 0.43591733
2 0.4624063 0.93180891
3 0.7085656 0.36468984
4 0.3339251 0.79093356
5 0.8236406 0.39687242
5.1 0.8236406 0.39687242
6 0.8266429 0.83213817
6.1 0.8266429 0.83213817
7 0.4624063 0.34714824
7.1 0.4624063 0.34714824
8 0.7085656 0.01812133
8.1 0.7085656 0.01812133
9 0.3339251 0.54498829
9.1 0.3339251 0.54498829
10 0.8236406 0.73677156
10.1 0.8236406 0.73677156
Я реплицировал строки фрейма данных df в соответствии с весами. Давайте запустим lm
Теперь без использования весов:
> lm(a~b, data=df2)
Call:
lm(formula = a ~ b, data = df2)
Coefficients:
(Intercept) b
0.6672 -0.0467
Как видите, результаты точно такие же!
Вы можете использовать вышеупомянутое, чтобы соответственно взвешивать ваш data.frame, а затем использовать его в своем spdep::lagsarlm
функция.