我的问题与this one非常相似,但我遇到的问题有一个扭曲,那些答案没有解决。具体来说,我正在估算空间模型y=rho * lw * y + X *beta
。因为观察与矩阵lw
相关,所以我必须同时将模型应用于整个X
矩阵。因为这些答案按行进行,所以它们不适用。
这是MWE数据,包括三组中的二十个点和一个空间权重矩阵:
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]]
指数并不合适。
答案 0 :(得分:1)
我把它放在那里因为它确实做了我想做的事,即使它需要使用for
循环(喘气)
predictobj <- list()
for(i in models$Group){
predictobj[[i]] <- predict.sarlm(models$sar[[i]],
newdata = filter(MyData2, Group == i),
listw = lw)
}
任何人都有dplyr
解决方案吗?
答案 1 :(得分:1)
我最后在do
中使用dplyr
执行此操作,逐行浏览models
data.frame。虽然输出不包含用于预测的新数据,但我相信它可以满足您的需求。不过,我确实在输出中添加了Group
,因为似乎有必要将组分开。
models %>%
do(data.frame(Group = .$Group,
predlm = predict(.$lm, newdata = filter(MyData2, Group == .$Group)),
predsar = predict(.$sar, newdata = filter(MyData2, Group == .$Group) , listw = lw)))
修改强>
将解释变量添加到输出data.frame中。以下工作,虽然可能有更好的方法来做到这一点。
models %>%
do(data.frame(Group = .$Group, IV = select(filter(MyData2, Group == .$Group), IV),
predlm = predict(.$lm, newdata = filter(MyData2, Group == .$Group)),
predsar = predict(.$sar, newdata = filter(MyData2, Group == .$Group) , listw = lw)))