【问题标题】:data.table J argument: function with 2 arguments by two groups with one fixed subsetdata.table J 参数:具有 2 个参数的函数,由两个组和一个固定子集组成
【发布时间】:2017-10-27 08:40:08
【问题描述】:

我正在使用 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[cyl %in% 4]) 中的错误: 没有足够的'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 检验不是由var2var1 计算的,否则当var2Ap 将为1,导致使用配对测试时出现相同的错误。

如何通过两组实现这一目标?

【问题讨论】:

  • 错误在于您尝试执行t.test 的方式而不是您的data.table 代码
  • 重点是通过cyl 值应用我的t 检验,如果我详细说明t.test 的参数,那么我必须设置一个固定的cyl。我知道data.table 处理这样的语法,例如diff:=qsec-qsec[cyl%in%4]。这就是我要重现的内容。
  • 对不起!我最初误读了这个问题......

标签: r data.table


【解决方案1】:

我认为这应该适合你:

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

将来,从一开始就发布实际用例会对您有所帮助,这样可以更轻松地提出可行的解决方案,而不必继续来回走动。

【讨论】:

  • 这很好,它似乎适用于一个by 级别,但不幸的是不适用于两个...
  • 如果你有两个按级别,只需在cyl %in% 4之后放入额外的参考组。如果您发布可重现的示例,我们可以为您提供更好的帮助
  • 例如:mt[,.(p=t.test(qsec,mt[cyl%in%4 & am == 1, qsec])$p.value),.(cyl, am)]
  • 抱歉,我一定是弄乱了我的数据,因为当我再次运行我的脚本时它工作了!非常感谢
  • 嗯,但是我仍然得到关于配对测试长度的错误......知道为什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 2019-10-08
相关资源
最近更新 更多