让Zelig使用列表

时间:2014-04-24 21:08:52

标签: r plyr r-zelig

我想列出匹配的数据集(使用MatchIt Package对其倾向得分进行匹配,以便在Zelig Package中进行后续建模。

在此示例中,我将匹配两个处理(t1t2),两个独立变量(x1x2),以及结果(y1)。

library(Zelig)
library(MatchIt)
library(plyr)

d1 <- data.frame(y1 = rbinom(100, 1, .5),
                 x1 = runif(100),
                 x2 = runif(100),
                 t1 = rbinom(100, 1, .5),
                 t2 = rbinom(100, 1, .5))

首先,我将列出匹配的数据框:

list.dfs <- llply(c("t1", "t2"), 
                  function(i) 
                  matchit(as.formula(paste0(i, "~ x1 + x2")), data= d1))

只需检查一下 - list.dfs的每个元素都有正确的类:

class(list.dfs[[1]])
  

[1] "matchit"

接下来,我想从此列表中获取元素匹配的数据框,并制作Zelig模型对象列表

list.mods <- llply(list.dfs, 
                   function(i) 
                   zelig(y1 ~ x1 + x2, model = "logit", data = match.data(i)))

其中提供了以下错误:

  

Error in match.data(i) : object 'i' not found

但这显然与列表有关,因为如果我对list.dfs的单个元素执行相同的功能,一切都有效:

class(zelig(y1 ~ x1 + x2, model = "logit", data = match.data(list.dfs[[1]])))

  

[1] "zelig" "logit"

我错过了什么?如何让Zelig处理此列表中的单独项目?

1 个答案:

答案 0 :(得分:2)

zelig中似乎有一些奇怪的东西,它们按名称查找data的值。看起来你将不得不做一个明确的循环:

list.mods <- list()
for(i in seq_along(list.dfs)) {
    list.mods[[i]] <- zelig(y1 ~ x1 + x2, model = "logit", data = match.data(list.dfs[[i]]))
}
list.mods