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 清楚地暗示了这一点。我看得不够仔细。
可以使用带有 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
只是为了跟踪扩展数据中的复制,没有其他原因。
我意识到了这个问题(感谢
summary(lm(y_WLS ~ x1_WLS + x2_WLS))
我用
summary(lm(y_WLS ~ 0 + sqrt(w) + x1_WLS + x2_WLS))
(去掉常数,加上sqrt(w)
作为回归量),两者完全一样。 Wooldridge 清楚地暗示了这一点。我看得不够仔细。