我正在使用data.table的J
参数来获取变量的置信区间,如下所示:
mt=data.table(mtcars)
mt_m=mt[,.(qsec=mean(qsec),CI1=t.test(qsec)$conf.int[1],CI2=t.test(qsec)$conf.int[2]),.(cyl)]
mt_m
cyl qsec CI1 CI2
1: 6 17.97714 16.39856 19.55573
2: 4 19.13727 18.00699 20.26755
3: 8 16.77214 16.08159 17.46270
绘制平均值和错误栏非常有用。但现在我想针对我的控制测试每个条件并获得p值,例如mt[,.(p=t.test(qsec,qsec[cyl%in%4])$p.value),.(cyl)]
(显然不起作用)。
t.test.default中的错误(qsec,qsec [%4中的cyl%]): 没有足够的'y'观察
complete.cases(x,y)出错: 并非所有参数都具有相同的长度
(paired test)
有没有办法使用data.table来实现这个目标?
修改
Mike的答案适用于第一个MWE,只有一个组。但是,我的数据表有两个:
dt=data.table(var1=c(rep(1,18),rep(2,18),rep(3,18)),
var2=rep(c("A","B","C"),54),score=runif(162))
dt_m=dt[,list(score=mean(score),CI1=TCI1(score),CI2=TCI2(score),
p=t.test(score,dt[var2%in%"A",score])$p.value),
.(var1,var2)]
dt_m
var1 var2 score CI1 CI2 p
1: 1 A 0.5291396 0.3737159 0.6845634 0.6062132
2: 1 B 0.4784482 0.3426129 0.6142835 0.9326820
3: 1 C 0.5445497 0.4079861 0.6811133 0.4452131
4: 2 A 0.5047712 0.3519982 0.6575442 0.8146140
5: 2 B 0.4717234 0.3406157 0.6028311 0.8605529
6: 2 C 0.4670736 0.3273769 0.6067704 0.8205882
7: 3 A 0.4210423 0.2671292 0.5749555 0.4531821
8: 3 B 0.4392489 0.2828231 0.5956746 0.5952569
9: 3 C 0.4308970 0.3267391 0.5350549 0.4078637
t检验不是由var2
&计算的。 var1
,p
为var2
时A
为{1}},使用配对测试时会出现同样的错误。
如何通过两组来实现这一目标?
答案 0 :(得分:2)
我认为这应该适合你:
mt[,.(p=t.test(qsec,mt[cyl%in%4, qsec])$p.value),.(cyl)]
# cyl p
#1: 6 0.181367998
#2: 4 1.000000000
#3: 8 0.001004706
由于您希望cyl
进行测试以访问参考向量(其中cyl == 4),您需要调用mt
。
修改强> 对于编辑过的数据,这是你想要的吗?
dt_m=dt[,list(score = mean(score),
p = t.test( score, dt[ var2 %in% "A" & var1 == .SD[,var1], score], paired = T)$p.value),
.(var1,var2), .SDcols = c("var1","score")]
dt_m
# var1 var2 score p
#1: 1 A 0.5315900 NaN
#2: 1 B 0.4632127 0.43045276
#3: 1 C 0.5630583 0.77617068
#4: 2 A 0.4084932 NaN
#5: 2 B 0.4977118 0.34873263
#6: 2 C 0.5238550 0.29289210
#7: 3 A 0.3653734 NaN
#8: 3 B 0.6186752 0.03029701
#9: 3 C 0.4629279 0.23013739
将来,从一开始就发布实际用例会很有帮助,这样可以更容易地找到有效的解决方案,而不必继续来回。