2014-01-12 6 views
0

Я пытаюсь использовать mapply, чтобы применить t.test к двум спискам аргументов. Первый список formulas содержит три формулы, а второй список periods содержит три вектора, которые подмножество my.data, которое я передаю с аргументом MoreArgs.mapply с аргументами как два списка (одна формула, один вектор)

Я могу сделать t.test s вручную с помощью петли for (также ниже), но я не могу понять, почему мое использование mapply не выполняется. Неправильное время для использования mapply?

# similar data 
my.data <- data.frame(CAR1=rnorm(150), 
         CAR2=rnorm(150), 
         CAR3=rnorm(150), 
         period=rep(1:3, each=50), 
         treated=rep(1:2, times=75) 
        ) 

# two lists to pass as arguments to `t.test()` 
# `subset` 
periods <- list(my.data$period == 1, 
       my.data$period <= 2, 
       my.data$period <= 3 
       ) 
# `formula` 
formulas <- list(CAR1 ~ treated, 
       CAR2 ~ treated, 
       CAR3 ~ treated 
       ) 

# manual solution works 
ttests <- list() 
for (i in 1:3) { 
    ttests[[i]] <- t.test(formulas[[i]], 
          data=my.data, 
          subset=periods[[i]] 
         ) 
} 

# but `mapply` fails 
ttest <- mapply(FUN=t.test, 
       formula=formulas, 
       subset=periods, 
       MoreArgs=list(data=my.data), 
       SIMPLIFY=FALSE 
       ) 

# with error "Error in eval(expr, envir, enclos) : object 'dots' not found" 

ответ

1

Если разделить ваш data.frame согласно period, вам не нужен periods объект.

split.my.data <- split(my.data, f = my.data$period) 

mapply(FUN = function(x, y) { 
    t.test(x, data = y) 
}, x = formulas, y = split.my.data, SIMPLIFY = FALSE) 

[[1]] 

    Welch Two Sample t-test 

data: CAR1 by treated 
t = -0.7051, df = 44.861, p-value = 0.4844 
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval: 
-0.9277752 0.4466579 
sample estimates: 
mean in group 1 mean in group 2 
     0.1650074  0.4055661 


[[2]] 
... # output truncated 

EDIT

В случае, когда вы хотите, чтобы подмножество факторов на основе логического оператора, кроме ==, я хотел бы создать «разделенный список», как так.

split.my.data <- sapply(periods, FUN = function(x, my.data) my.data[x, ], 
     my.data = my.data, simplify = FALSE) 
+0

Спасибо! Хорошая точка зрения! Но что, если мои периоды выборки не являются взаимоисключающими? (Я улучшу свой пример.) Вы бы предложили такой подход? Невозможно передать «подмножество» в список? –

+0

Я добавил еще один пример того, как я построил список, который будет передан в 'mapply'. –