我没有使用过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 函数中使用它。