使用splm包spml函数估计空间面板模型时遇对象长度不匹配错误
解决空间面板模型
object lengths differ报错问题 问题根源
报错的核心原因是:你基于包含所有年份的面板空间数据(共690×7=4830行)生成了邻接矩阵,但空间权重矩阵应该对应690个截面街区组(地理邻接关系不随年份变化),两者长度不匹配导致lag.listw函数报错。
修复步骤及代码
1. 提取截面空间数据(单一年份的街区组)
从面板数据中提取唯一的街区组空间信息,地理邻接关系不会随年份改变,只需保留每个街区组的一个空间实例即可:
# 提取2013年的截面空间数据,确保每个街区组只出现一次 bp_sf_cross <- bp_sf_subset[bp_sf_subset$year == 2013, ] # 若街区组ID在全数据中唯一,也可以用去重方法: # bp_sf_cross <- bp_sf_subset[!duplicated(bp_sf_subset$block_group), ]
2. 基于截面数据重新生成空间权重矩阵
# 生成邻接矩阵 nb2 <- poly2nb(bp_sf_cross, queen=TRUE) # 为相邻多边形分配权重(行标准化) lw2 <- nb2listw(nb2, style="W", zero.policy=TRUE) # 转换为适合面板模型的对称权重矩阵 W <- listw2U(lw2)
3. 重新运行空间面板模型
# 估计空间面板数据模型 model <- spml(formula = viol_index_crime_rate_rep ~ ice_index + unemployment_rate_pop + poverty_rate_hh, data = bp_sf_subset, index = c("block_group","year"), model = "within", lag=TRUE, spatial.error = "b", effect = "twoways", listw = W)
验证建议
- 检查权重矩阵维度:运行
dim(W)应返回690 690,与你的街区组数量一致。 - 确认面板数据中每个
block_group在各年份都有完整观测,无重复或缺失。
内容的提问来源于stack exchange,提问作者skol
相关产品推荐
相关产品推荐

