提取数据表的置信区间

4

我想要做的是为比例的上下置信区间设置列。

这是我所做的:

> #Create some sample data
> Frustration <- data.table(group = c('A','B','C'), trials = c(363,1398,139), surg = c(57,276,18))
> Frustration
   group trials surg
1:     A    363   57
2:     B   1398  276
3:     C    139   18
> 
> #try to get confidence levels. what I am expecting is CI to be a list of 2 elements, for each value of group, but I don't think that is working
> F2 <- Frustration[, .(CI = prop.test(surg, trials, conf.level = .75)['conf.int']), by = .(group)]
> F2
   group                    CI
1:     A   0.1350140,0.1816828
2:     B   0.1851178,0.2103210
3:     C 0.09701967,0.16972056
> 
> #lower is still a list here - I am stumped
> F3 <- F2[, .(lower = CI[[1]]), by = .(group)]
> F3
   group                 lower
1:     A   0.1350140,0.1816828
2:     B   0.1851178,0.2103210
3:     C 0.09701967,0.16972056

我认为我的困惑与列表有关,以及数据表如何处理返回值。

谢谢你的帮助,

David

2个回答

3
这段内容翻译为:"

CI 是一个列表列。我们可以使用 transpose 并赋值 (:=)。

"
library(data.table)
F2[, c('lower', 'upper') := data.table::transpose(CI)][, CI := NULL][]
#Key: <group>
#    group      lower     upper
#   <char>      <num>     <num>
#1:      A 0.13501400 0.1816828
#2:      B 0.18511780 0.2103210
#3:      C 0.09701967 0.1697206

1
这就是我正在寻找的函数,transpose - r2evans
所以这个可以运行,但我不理解。我的想法是错误的,即对于每个组,CI将是一个单独的2元素列表,因此取第一个元素作为下限会起作用。转置意味着对于每个组,CI是其他东西,但是是什么? - DavidF
@DavidF 你可以打印F2$CI,它是一个list列,每个列表元素中有两个元素。data.table::transpose(F2$CI)通过将列表的每个对应元素连接成一个向量来改变list的长度,即每个列表元素的第一个元素由单个向量组成,同样地,第二个元素即下限和上限组件被重新分组为新列表中的两个向量。 - akrun

2
另一个解决方案可行,但下面是一个简单的一行代码:
library(data.table)

Frustration <- data.table(group = c('A','B','C'), trials = c(363,1398,139),
                          surg = c(57,276,18))

Frustration[, c("lower", "upper") := 
              as.list(prop.test(surg, trials, conf.level = .75)$conf.int), 
            by=group][]
#>    group trials surg      lower     upper
#> 1:     A    363   57 0.13501400 0.1816828
#> 2:     B   1398  276 0.18511780 0.2103210
#> 3:     C    139   18 0.09701967 0.1697206

更加简单的方法是,您需要进行一些重命名:

Frustration[, as.list(prop.test(surg, trials, conf.level = .75)$conf.int), by=group]
#>    group         V1        V2
#> 1:     A 0.13501400 0.1816828
#> 2:     B 0.18511780 0.2103210
#> 3:     C 0.09701967 0.1697206

谢谢。这让我更明白了,但我仍然在 struggle with the as.list。prop.test 不是返回一个列表的列表吗?当我尝试 Frustration[, prop.test(surg, trials, conf.level = .75)['conf.int'], by=group] 时,我得到了8行,而不是你的4行。我认为这就是解决方案1中需要转置的原因,但我仍然感到困惑。谢谢。 - DavidF
2
不,如果你执行class(prop.test(2, 10)$confint),你会看到它返回一个长度为2的数值向量。将其用 as.list 包装,我将其转换为一个具有两个元素的列表,每个元素都是单个数值。data.table 看到列表,并将该列表的每个元素解释为一列。由于每个列只有1个元素,因此你只得到1行。相比之下,你的调用包括一个单独的元素(长度为2的向量),因此 data.table 将这解释为你要求1列,其中包含2行的数据。 - Vincent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接