面板数据2SLS回归报variable lengths differ错误的解决咨询
解决面板数据2SLS中拟合值长度不匹配的问题
我帮你梳理下这个问题的核心和解决方案:你遇到的「variable lengths differ」错误确实是因为第一阶段回归使用滞后项后,拟合值只保留了有有效滞后值的观测,长度比原始数据短,直接绑定就会出现行数不匹配。下面是两种可行的解决方法,推荐第二种更简洁的面板专用方案:
方法一:手动匹配拟合值到原始数据
我们需要把第一阶段的拟合值对应放回原始数据的正确行,缺失的位置补NA,确保拟合值向量和原始数据长度一致:
library(bootstrap) library(AER) library(systemfit) library(sandwich) library(lmtest) library(boot) library(laeken) library(smoothmest) library(glm2) library(tidyverse) library(foreign) library(plm) # 加载数据,避免使用attach()防止命名冲突 data_09 <- read.csv("panel2009.csv") table(is.na(data_09)) # ---------------------- 第一阶段回归 & 拟合值匹配 ---------------------- # 回归S firstpan <- plm(S ~ act + plm::lag(S) + S_active + C_tot, data = data_09, na.action = na.exclude, index = c("individual","year"), method = "within", effect = "twoways") # 获取第一阶段回归用到的观测行名,匹配回原始数据 first_indices <- rownames(model.frame(firstpan)) S_hat <- rep(NA, nrow(data_09)) names(S_hat) <- rownames(data_09) S_hat[first_indices] <- fitted(firstpan) # 回归S_active secondpan <- plm(S_active ~ act + act*plm::lag(towater) + S + C_tot, data = data_09, na.action = na.exclude, index = c("individual","year"), method = "within", effect = "twoways") second_indices <- rownames(model.frame(secondpan)) S_active_hat <- rep(NA, nrow(data_09)) names(S_active_hat) <- rownames(data_09) S_active_hat[second_indices] <- fitted(secondpan) # ---------------------- 将拟合值加入数据 & 运行IV回归 ---------------------- data_09 <- data_09 %>% mutate(S_hat = S_hat, S_active_hat = S_active_hat) iv <- ivreg(Y ~ act + S + S_active + C_tot | act + S_hat + S_active_hat + C_tot, data = data_09, na.action = na.exclude) summary(iv)
方法二:直接用plm包做面板2SLS(更推荐)
其实plm本身支持面板数据的工具变量回归,不需要手动提取拟合值,它会自动处理滞后项导致的观测缺失,代码更简洁且不易出错:
# 直接用plm运行面板2SLS iv_plm <- plm( # 左边是第二阶段的回归式,右边是外生变量+所有工具变量 Y ~ act + S + S_active + C_tot | act + C_tot + plm::lag(S) + plm::lag(towater) + act*plm::lag(towater), data = data_09, index = c("individual","year"), method = "within", # 和第一阶段固定效应保持一致 effect = "twoways", instrumental = TRUE # 开启工具变量模式 ) summary(iv_plm)
这里的公式规则是:|左侧是第二阶段的所有自变量(包括内生变量),右侧是所有外生变量+工具变量(也就是第一阶段回归里的全部自变量)。这样plm会自动完成两阶段回归,不需要手动处理拟合值的匹配问题。
额外提醒
尽量避免使用attach(),它会把数据框的变量直接放到全局环境,很容易和已有的函数/变量重名,导致难以排查的错误。
内容的提问来源于stack exchange,提问作者Lomnewton
相关产品推荐
相关产品推荐

