我的問題與this one非常相似,但是我面臨的問題存在一些問題,那些答案沒有解決。具體來說,我估計了一個空間模型,y=rho * lw * y + X *beta
。因爲觀察結果與矩陣lw
有關,我必須同時將模型應用於整個X
矩陣。因爲這些答案是按行進行的,所以它們不適用。將分組模型應用於分組
這裏是MWE數據,包括跨三組20分和空間權重矩陣:
library(spdep)
#Coordinates
pointcoords <- data.frame(x = runif(n=20, min =10, max = 100), y = runif(n=20, min = 10, max = 100), ID = as.character(1:20))
pointsSP <- SpatialPoints(pointcoords[,1:2])
# Weights matrix
lw <- nb2listw(knn2nb(knearneigh(pointsSP, k = 4, RANN = FALSE),
row.names = pointcoords$ID))
# Data
MyData <- data.frame(ID = rep(1:20, each = 3),
Group = rep(1:3, times = 20),
DV = rnorm(60),IV = rnorm(60))
我可以Group
與dplyr
library(dplyr)
models <- MyData %>% group_by(Group) %>%
do(lm = lm(DV ~ IV, data = .),
sar = lagsarlm(DV ~ IV, data = ., listw = lw))
預測與新數據估計模型this answer按行進行操作,對於lm
對象正常工作,
MyData2 <- data.frame(ID = rep(1:20, each = 3),
Group = rep(1:3, times = 20),
IV = rnorm(60))
MyData2 %>% left_join(models) %>% rowwise %>%
mutate(lmPred = predict(lm, newdata = list("IV" = IV))) %>% head()
#Joining by: "Group"
#Source: local data frame [6 x 6]
#Groups:
# ID Group IV lm sar lmPred
#1 1 1 -0.8930794 <S3:lm> <S3:sarlm> -0.21378814
#2 1 2 -1.6637963 <S3:lm> <S3:sarlm> 0.42547796
#3 1 3 0.5243841 <S3:lm> <S3:sarlm> -0.23372996
#4 2 1 -0.1956969 <S3:lm> <S3:sarlm> -0.20860280
#5 2 2 0.8149920 <S3:lm> <S3:sarlm> 0.14771431
#6 2 3 -0.3000439 <S3:lm> <S3:sarlm> 0.05082524
但不是爲sar
型號:
MyData2 %>% left_join(models) %>% rowwise %>%
mutate(sarPred = predict(sar, newdata = list("IV" = IV), listw=lw)) %>% head()
#Joining by: "Group"
#Error in if (nrow(newdata) != length(listw$neighbours)) stop("mismatch between newdata and spatial weights") :
argument is of length zero
我覺得應該有這樣做的,沒有加入該模型的每一行的更好的方法。另外,如果您有多個或更改預測變量,則爲newdata
創建列表對象將不起作用。看來,dplyr
的方法應該是這樣的:
MyData2 %>% group_by(Group) %>%
mutate(sarPred = predict(models$sar[[Group]], newdata = ., listw=lw))
但[[Group]]
指數是不完全正確。
嗯。如果你使用'list(「IV」= IV,listw = lw)''你的第一次嘗試是否工作?即將權重*和*'「IV」'傳遞給預測函數。 – AndrewMacDonald
不,它給出一個錯誤,「需要的空間權重列表」。 – gregmacfarlane