我想使用 AER 包中的 ivreg 在 R 中运行 IV 回归。输出给了我一个负的 R^2 ,据我所知,这应该是不可能的。当使用 2SLS 手动运行相同的回归时,R^2 虽然非常小,但仍为正。
这是因为 AER 包使用真实的 X 而不是第一阶段的预测/拟合值来计算残差。当拟合非常差但手动使用 ivreg 和 2SLS 之间的 R^2 总是不同时,就会发生这种情况。我的问题是AER包中R^2的计算是否错误,或者在这种情况下R^2是否可能为负数。 这是一些重现负 R^2 的代码:
library(AER)
set.seed(40)
n <- 100
# Data generation
Z <- rnorm(n, 10, 2)
X <- 2 * Z + rnorm(n, 0, 10000)
Y <- 3 * X + rnorm(n, 0, 1000000)
df <- data.frame(Z, X, Y)
# IV regression
ivreg1 <- ivreg(Y ~ X | Z, data = df)
summary(ivreg1)
# 2SLS approach
lm1 <- lm(X ~ Z, data = df)
df$predict <- predict(lm1)
lm2 <- lm(Y ~ predict, data = df)
summary(lm2)
ivreg函数的输出:
Call:
ivreg(formula = Y ~ X | Z, data = df)
Residuals:
Min 1Q Median 3Q Max
-3513062 -843258 -33611 845922 4533273
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 43430.1 165298.8 0.263 0.793
X -114.1 131.9 -0.865 0.389
Residual standard error: 1553000 on 98 degrees of freedom
Multiple R-Squared: -1.665, Adjusted R-squared: -1.692
Wald test: 0.7479 on 1 and 98 DF, p-value: 0.3893
R^2 将完整模型的 MSS 与仅常数模型进行比较。当两个模型未嵌套时,可能会导致负 R^2,这就是 IV 回归所发生的情况。主要问题是生成 X 和 Y 时的标准差太大(sd 分别为 10000 和 100000)。降低 sd 会给你想要的输出。
# Data generation
Z <- rnorm(n, 10, 2)
X <- 2 * Z + rnorm(n, 0, 1)
Y <- 3 * X + rnorm(n, 0, 1)
df <- data.frame(Z, X, Y)
# IV regression
ivreg1 <- ivreg(Y ~ X | Z, data = df)
summary(ivreg1)
Call:
ivreg(formula = Y ~ X | Z, data = df)
Residuals:
Min 1Q Median 3Q Max
-2.42247 -0.60029 -0.09537 0.83643 2.01900
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.6215 0.4983 -1.247 0.215
X 3.0354 0.0242 125.449 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.9427 on 98 degrees of freedom
Multiple R-Squared: 0.9942, Adjusted R-squared: 0.9942
Wald test: 1.574e+04 on 1 and 98 DF, p-value: < 2.2e-16