【发布时间】:2020-02-13 14:00:04
【问题描述】:
我想使用单独的分组在 R 中执行两个样本 t 检验。 t.test 必须是“无偏的”,这意味着对于外部组(下面的第 2 组)中的所有事务,必须为每个内部组(下面的第 1 组)运行 T 测试,例如:“内部组 A”与“内部组不是 A”。下面显示的for循环代码可能比口头解释更清楚...
我当前的代码如下。有谁知道更快/更好的方法来做到这一点?开放使用任何包,但目前使用data.table。
就上下文而言,我有大约 100 万行交易数据。组 1 表示一个人(如果有多个行,他们有多个事务)并包含约 30k 唯一值。第 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]
【问题讨论】:
-
你有没有想过使用 R 中已有的
t.test之类的函数? -
次要评论:
data.table()(和data.frame())从参数中提取默认列名,因此data.table(grp1 = grp1, grp2 = grp2, vals = vals)相当于更简单的data.table(grp1, grp2, vals) -
@Not_Dave - 我添加了有关真实数据大小和当前运行时间的附加信息
标签: r statistics data.table vectorization t-test