Я хотел бы выполнить двухвыборочный t-тест в R, используя отдельные группы. T.test должен быть «беспристрастным», что означает, что для всех транзакций во внешней группе (группа 2 ниже), тест T должен выполняться для каждой внутренней группы (группа 1 ниже), например: «внутренняя группа A» vs. внутренняя группа не А ". Показанный ниже код цикла for
, вероятно, более ясен, чем словесное объяснение ...
Мой текущий код ниже. Кто-нибудь знает более быстрый / лучший способ сделать это? Открыт для использования любого пакета, но в настоящее время используется data.table
.
Для контекста у меня есть ~ 1 миллион строк данных транзакции. Группа 1 указывает человека (если есть несколько строк, у них есть несколько транзакций) и содержит ~ 30 тыс. Уникальных значений. Группа 2 обозначает почтовый индекс и содержит ~ 500 уникальных значений.
Спасибо!
library(data.table)
# fake data
grp1 <- c('A','A','A','B','B','C','C','D','D','D','D','E','E','E','F','F')
grp2 <- c(1,1,1,1,1,1,1, 2,2,2,2,2,2,2, 2,2)
vals <- c(10,20,30, 40,15, 25,60, 70,100,200,300, 400,1000,2000, 3000,5000)
DT <- data.table(grp1 = grp1, grp2 = grp2, vals = vals)
# "two sample t.test" --------------------------------------------------
# non vectorized, in-place
# runtime is ~50 mins for real data
for (z in DT[,unique(grp2)]){
for (c in DT[grp2 == z, unique(grp1)]) {
res = t.test(
DT[grp2 == z & grp1 == c, vals],
DT[grp2 == z & grp1 != c, vals],
alternative = 'greater'
)
DT[grp2 == z & grp1 == c, pval := res$p.value]
DT[grp2 == z & grp1 == c, tstat := res$statistic]
}
}
# vectorized, creates new summarized data.table
# runtime is 1-2 mins on real data
vec <- DT[,{
grp2_vector = vals
.SD[,.(tstat = t.test(vals, setdiff(grp2_vector, vals), alternative = 'g')$statistic,
pval = t.test(vals, setdiff(grp2_vector, vals), alternative = 'g')$p.value), by=grp1]
} , by=grp2]
t.test
, которая уже доступна в R? - person Not_Dave   schedule 16.10.2019data.table()
(иdata.frame()
) извлекают имена столбцов по умолчанию из аргументов, поэтомуdata.table(grp1 = grp1, grp2 = grp2, vals = vals)
эквивалентно более простомуdata.table(grp1, grp2, vals)
- person Gregor Thomas   schedule 16.10.2019