Весовые наблюдения в модели 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 функция.

Другие вопросы по тегам