WLS 的手动计算与 R 中 lm() 的输出不匹配

Manual calculation of WLS does not match output of lm() in R

可以使用带有 weights 选项的命令 lm() 在 R 中计算加权最小二乘法。为了理解公式,我也手动计算了它们,但结果不一样:

# Sample from model
set.seed(123456789) 
x1 <- 10 * rbeta(500, 2, 6) 
x2 <- x1 + 2*rchisq(500, 3, 2) + rnorm(500)*sd(x1)
u <- rnorm(500) 
y <- 0.5 + 1.2*x1 - 0.7*x2 + u

# Produce weights (shouldn't matter how)
w <- x1/sd(x1)
# Manual WLS
y_WLS <- y*sqrt(w)
x1_WLS <- x1*sqrt(w)
x2_WLS <- x2*sqrt(w)
summary(lm(y_WLS ~ x1_WLS + x2_WLS))
# Automatic WLS
summary(lm(y ~ x1+x2, weights=w))

这两个命令给出了不同的结果。应该是完全一样的。我只是按照 Wooldridge (2019) 第 8.4a 节的说明进行操作,我在下图中合并了哪些相关位:

如您所见,权重为 w 的 WLS 等同于转换模型中的 运行 OLS,其中每个变量都乘以 w 的平方根,即我在上面做了什么。那为什么不一样呢?

据我所知,weights不一定与值相乘,而是可以概念化为每个值的频率。换句话说,每个值的复制次数应与 weights 一样多。例如, 让我们将您的 w 四舍五入到最接近的整数,将它们放入 data.frame 中,并在四舍五入的 w.

中复制每个整数
# create a data frame with an id and rounded weights
data <-data.frame(id=1:length(y),y=y,x1=x1,x2=x2,w=w,weight=round(w))     

# now replicate the rows as the value of weights
data.expanded<-data[rep(row.names(data),data$weight),]

# let's fit the manual WLS model
summary(lm(y ~ x1 + x2,data = data.expanded))

Coefficients:
             Estimate Std. Error  t value Pr(>|t|)    
(Intercept)  0.511824   0.096365    5.311  1.4e-07 ***
x1           1.182342   0.024249   48.758  < 2e-16 ***
x2          -0.693060   0.004643 -149.269  < 2e-16 ***

# also fit the automated WLS
summary(lm(y ~ x1+x2, weights=w))

    Coefficients:
             Estimate Std. Error  t value Pr(>|t|)    
(Intercept)  0.519752   0.125816    4.131 4.24e-05 ***
x1           1.181847   0.031544   37.466  < 2e-16 ***
x2          -0.693566   0.006047 -114.694  < 2e-16 ***

如您所见,我们在两种方法中得到了相似的结果。由于 weights 的四舍五入,您看到的细微差异。对于大型数据集,这种差异几乎可以忽略不计。

请注意,创建 id 只是为了跟踪扩展数据中的复制,没有其他原因。

我意识到了这个问题(感谢 post)。转换实际上删除了常量并添加了一个新变量,它是权重的平方根。因此,如果不是

summary(lm(y_WLS ~ x1_WLS + x2_WLS))

我用

summary(lm(y_WLS ~ 0 + sqrt(w) + x1_WLS + x2_WLS))

(去掉常数,加上sqrt(w)作为回归量),两者完全一样。 Wooldridge 清楚地暗示了这一点。我看得不够仔细。