2014-07-21 64 views
1

我的問題與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)) 

我可以Groupdplyr

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

嗯。如果你使用'list(「IV」= IV,listw = lw)''你的第一次嘗試是否工作?即將權重*和*'「IV」'傳遞給預測函數。 – AndrewMacDonald

+0

不,它給出一個錯誤,「需要的空間權重列表」。 – gregmacfarlane

回答

1

我把這個在那裏,因爲它做什麼,我想它,即使它需要使用for環(GASP)

predictobj <- list() 
for(i in models$Group){ 
    predictobj[[i]] <- predict.sarlm(models$sar[[i]], 
            newdata = filter(MyData2, Group == i), 
            listw = lw) 
} 

人有一個dplyr解決方案?

+0

這種方法的一個優點是它可以更容易並行化,至少我發現。 – gregmacfarlane

1

我結束了這樣做dodplyr,通過models data.frame rowwise。我相信它可以做你想做的,儘管輸出不包含用於預測的新數據。儘管如此,我還是在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))) 

EDIT

與添加解釋變量到輸出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))) 
+0

這很好,但我認爲它不會通過'models' * rowwise *,因爲'models'是一個列表。肯定會有一些後期處理來正確地附加數據,但現在這個工作。我認爲這也是另一個問題的更好答案。 – gregmacfarlane

+0

我沒有'dplyr'下來的所有語言,但我正在處理的'models'對象似乎是一個rowwise data.frame('rowwise_df')。我之前沒有遇到過這個術語,但我最初試圖對'models'進行分組,並被警告'按行劃分rowwise數據幀「。 – aosmith