Как заставить Зелига работать со списками

Я хочу взять список сопоставленных наборов данных (где наблюдения сопоставляются по их оценкам склонности, используя MatchIt Package) для последующего моделирования в пакете Zelig.

В этом примере я буду сравнивать две процедуры (t1 и t2), две независимые переменные (x1 и x2) и результат (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"

Что мне не хватает? Как я могу заставить Зелига работать над отдельными пунктами в этом списке?


person tomw    schedule 24.04.2014    source источник


Ответы (1)


Кажется, внутри 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
person Thomas    schedule 24.04.2014