【发布时间】:2018-04-09 12:18:47
【问题描述】:
我对下面显示的空间回归代码有一个问题(代码示例)。运行回归后,出现以下错误
Error in listw %*% as.matrix(ywithin) :
Cholmod error 'X and/or Y have wrong dimensions' at file ../MatrixOps/cholmod_sdmult.c, line 90
当我从回归中删除空间维度时,回归运行完美,所以我猜错误可能在空间权重矩阵中。有人可以帮我解决出现此错误的原因并推荐解决方案吗?
参考数据:
链接到包含 shapefile 和数据的文件夹: https://drive.google.com/drive/folders/1PFAhCpYnDCtV36DuTLh4V79Bs3RO5ESy?usp=sharing
代码示例(下载文件并显示错误)
requiredPackages <-
c("rio", "plm", "splm", "tmaptools", "spdep", "fields", "readxl")
ipak <- function(pkg) {
new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
if (length(new.pkg))
install.packages(new.pkg, dependencies = TRUE)
sapply(pkg, require, character.only = TRUE)
}
ipak(requiredPackages)
# URL's obtained from Google Shared Directory
pShareDataURL = "https://drive.google.com/open?id=1PjDlLiA99-3xuGPhPLltRg8uod6zPAKn" ## data1.xlsx
sShareDataURL = "https://drive.google.com/open?id=1VJGL8aSJomvWCnw9FPEWTJsQ65StYdzW" ## nuts2ashp
## strip "open?" and replace with us?export=download&
pdataURL <- gsub("open\\?", "uc\\?export=download\\&", pShareDataURL )
sdataURL <- gsub("open\\?", "uc\\?export=download\\&", sShareDataURL )
pdataDest = file.path("./data/data1.xlsx" )
sdataDest = file.path("./data/nuts2a.shp" )
if (!dir.exists("./data")) {
dir.create(file.path("./data"), showWarnings = FALSE)
}
# Download files
download.file(pdataURL, destfile = pdataDest, method = "wget", mode = "wb")
download.file(sdataURL, destfile = sdataDest, method = "wget", mode = "wb")
pdata <- read_excel(pdataDest)
shape_nuts <- read_shape(sdataDest)
shape_nuts <- shape_nuts[order(shape_nuts@data$NUTS_ID), ]
shape_nuts2 <-
shape_nuts[substr(shape_nuts@data$NUTS_ID, 1, 3) != "FR9" &
shape_nuts@data$NUTS_ID != "UKI1"
&
shape_nuts@data$NUTS_ID != "EL21" &
shape_nuts@data$NUTS_ID != "RO21", ]
#######computing the spatial weight matrix###########
coords2 <- coordinates(shape_nuts2) # getting coordinates of the polygon centroids
dm <- rdist.earth(coords2, miles = FALSE) # calculating distance between the polygon centroids
rownames(dm) <- shape_nuts2@data$NUTS_ID # naming the rows
colnames(dm) <- shape_nuts2@data$NUTS_ID # naming the columns
for (i in 1:dim(dm)[1]) {
dm[i, i] = 0
} # renders exactly zero all diagonal elements
dm1 <- ifelse(dm != 0, 1 / dm, dm) #inverting distance
# create a (normalized) listw object
dm1.lw <- mat2listw(dm1,
style = "W",
row.names = shape_nuts2@data$NUTS_ID)
#########regressions#######
spgr01 <- spgm(
rgrowthpc ~ lrgdp0pc + lefpayr,
data = pdata,
listw = dm1.lw,
model = "within",
lag = TRUE,
spatial.error = TRUE,
endog = ~ lefpayr,
instruments = ~ area_prop,
method = "w2sls"
)
控制台输出:
> #########regressions#######
>
> spgr01 <- spgm(
+ rgrowthpc ~ lrgdp0pc + lefpayr,
+ data = pdata,
+ listw = dm1.lw,
+ model = "within",
+ lag = TRUE,
+ spatial.error = TRUE,
+ endog = ~ lefpayr,
+ instruments = ~ area_prop,
+ method = "w2sls"
+ )
Error in listw %*% as.matrix(ywithin) :
Cholmod error 'X and/or Y have wrong dimensions' at file ../MatrixOps/cholmod_sdmult.c, line 90
>
【问题讨论】:
-
缺少代码。还是
pdata来自其中一个包的数据框?此外,listw未定义。此外,我不明白为什么需要spgm-regression 的 NUTS2 数据 -
pdata是 Google 驱动器上的 Excel 文件。 @Martin Hulenyi:您能否将其更改为 csv 并在您的示例中也包含read.csv()行。我认为dm1.lw应该是listw?当你改变它时,你会得到与提到的相同的错误消息。 -
@Martin - 我更新了您的代码示例以使其独立。这些文件现在已从您的共享中下载到代码示例中。为什么?我个人觉得不得不单独下载文件很痛苦。希望你不要介意。
标签: r spatial panel-data