R中的空间面板回归:不一致的空间权重?

时间:2017-10-02 12:24:31

标签: r regression panel spatial

我正在尝试使用splm包在R中运行空间面板回归。因此,随着时间的推移,我得到了包含汇总数据的多边形,我想看看因变量如何受到随时间变化的其他变量的影响。

我有546个区域有许多变量,但为了测试它是如何工作的,我为3个多边形获取了一部分数据,包括用于计算权重的shapefile和数据。

https://drive.google.com/file/d/0B4SK0f2zZUKxZ0dDU2lnclB2M3c/view?usp=sharing

#load data
file="sector_panel_data_test.csv"
sector_data=read.table(file,sep=",", header=T, quote="")
sector_data[is.na(sector_data)] <- 0
names(sector_data)
attach(sector_data)

#load shape
require (rgdal)
sectors <-readOGR(dsn=".",layer="sectors_test_sample_year1")
nb <- poly2nb(sectors)


#distance based neighbors
coords <- coordinates(sectors)
nb.d125<- dnearneigh(coords,0,125000,row.names=sectors$Code)

#create weights matrix
mat.d125 <-nb2mat(nb.d125,glist=NULL,style="W",zero.policy=TRUE)

#and then a weights list object
listd125 = mat2listw(mat.d125, style="W")

#design model and run, just picked one variable here
fm <- prop_fdeg ~ mean_pop
randommodel <-spml(fm, 
data=sector_data,index=NULL,listw=listFQQ,model="random", lag=FALSE)

我收到以下错误:

  

spreml中的错误(公式=公式,数据=数据,索引=索引,w = listw2mat(listw),:不一致的空间权重

有谁知道这意味着什么?我到处搜索,只发现有同样问题的人在寻找解决方案。

2 个答案:

答案 0 :(得分:1)

我也刚收到同样的错误。在使用我的数据逐步浏览源代码之后(见下文),面板数据中的缺失似乎导致某些行的列表删除。那些删除的行将反过来导致面板数据和listw对象具有不同的观察数量。要解决此问题,您需要(1)插入缺失的数据,(2)从listw对象中删除已删除的行,或者(3)从模型中删除缺少的变量。在我的情况下,输入所有丢失的数据似乎停止了错误。您还需要注意保持面板数据平衡,因为splm也会破坏大多数不平衡的面板数据(make.pbalanced中的plm命令似乎对解决不平衡问题没有太大帮助数据,因为它会添加splm将拒绝的NA的行。

一些方法可以检查缺失情况,估算丢失的数据和/或查看数据在源代码中的工作方式:

  1. 比较dim(your_data)dim(na.omit(your_data))

  2. 使用naniar可视化面板数据中的缺失(另请参阅新的panelView包)

    install.packages("naniar") # visualise missing data 
    library(ggplot2)
    library(naniar)
    gg_miss_var(your_data)  
    
  3. 对您的数据运行plm(不是splm),并检查输出中的数据维度(与原始数据相比)。

    p_out <- plm(formula = your_formula, data = your_data, model = "within") 
    summary(p_out)
    dim(model.matrix(p_out)) 
    
  4. 使用simputation包直接计算丢失数据的方法。有关详情,请参阅https://cran.r-project.org/web/packages/simputation/vignettes/intro.html

  5. Amelia软件包为多个插补提供了更好的选项,包括时间序列,横截面数据:https://gking.harvard.edu/amelia

  6. 直接在R-Forge运行spreml的基础代码。首先,查看下面的代码表明错误是由最后一行生成的。在这一行之上,我们可以看到n是如何定义的,这至少可以为调试提供一些可能的途径(通过直接运行底层代码来查看dim(w)与n(其中w <- your_listw_object)的不同之处

    ## data management through plm functions
    pmod <- plm(formula, data, index=index, model="pooling")
    X <- model.matrix(pmod)
    y <- pmodel.response(pmod)
    
    #names(index) <- row.names(data)
    #ind <- index[which(names(index) %in% row.names(X))]
    #tind <- tindex[which(names(index) %in% row.names(X))]
    
    ind <- attr(pmod$model, "index")[, 1]
    tind <- attr(pmod$model, "index")[, 2]
    oo <- order(tind, ind)
    X <- X[oo, , drop=FALSE]
    y <- y[oo]
    ind <- ind[oo]
    tind <- tind[oo]
    n <- length(unique(ind))
    k <- dim(X)[[2]]
    t <- max(tapply(X[, 1], ind, length))
    nT <- length(ind)
    
    ## check compatibility of weights matrix
    if (dim(w)[[1]] != n) stop("Non conformable spatial weights")
    

答案 1 :(得分:0)

这可能与您的问题无关,但希望可以帮助其他人搜索此错误。

数据必须采用特定的格式:前两列依次包含indextime,其余为剩余变量。切换timeindex将导致Non conformable spatial weights,因为dim(w) != n,其中$ n $是time的唯一元素的数目。