如何对 Dataframe 中的每一行进行两个比例属性测试?

njthzxwz  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(78)

结果为每一行生成相同的p值,而当我单独计算每一行时,p值看起来不同。
我试图测试基线和基线比例之间的差异,这里是数据

group n_Baseline n_Endline sample_Baseline sample_Endline
  <chr>      <int>     <int>           <dbl>          <dbl>
1 A            164       158             305            273
2 B             89        65             131            106
3 C             59        68             118            108
4 D             52        48              90             84
5 E            141       107             224            186

我尝试了下面的指令:

df$P_Values <- apply(df, 1, function(x) prop.test(x = c(df$n_Baseline, df$n_Endline), n = c(df$sample_Baseline, df$sample_Endline))$p.value).

每一行的结果都具有相同的p值:

group n_Baseline n_Endline sample_Baseline sample_Endline P_Values
  <chr>      <int>     <int>           <dbl>          <dbl>    <dbl>
1 A            164       158             305            273    0.109
2 B             89        65             131            106    0.109
3 C             59        68             118            108    0.109
4 D             52        48              90             84    0.109
5 E            141       107             224            186    0.109

然而,当我为每一行单独执行此操作时,pvalue非常不同。例如,在第一行中:

prop.test(x = c(164, 158), n = c(305, 273))

输出量:
2-具有连续性校正的比例相等样本检验
数据:c(164,158)/c(305,273)X平方= 0.82448,df = 1,p值= 0.3639备择假设:双侧95%置信区间:-0.12552283 0.04342351样本估计值:2019 - 05 - 25 00:00:00
为什么以及如何获得每一行的确切p值,而不是同一行?

x4shl7ld

x4shl7ld1#

最简单的方法可能是在tidyverse中通过dplyr内部的rowwise计算

library(tidyverse)

df %>%
  rowwise() %>%
  mutate(pval = prop.test(x = c(n_Baseline, n_Endline), 
                          n = c(sample_Baseline, sample_Endline))$p.value)
#> # A tibble: 5 x 6
#> # Rowwise: 
#>   group n_Baseline n_Endline sample_Baseline sample_Endline   pval
#>   <chr>      <int>     <int>           <int>          <int>  <dbl>
#> 1 A            164       158             305            273 0.364 
#> 2 B             89        65             131            106 0.355 
#> 3 C             59        68             118            108 0.0676
#> 4 D             52        48              90             84 1.00  
#> 5 E            141       107             224            186 0.310

如果你想坚持使用基本的R,那么你可以使用apply,但是你的apply语法在这里是不正确的。apply中的函数将 Dataframe 的每一行作为向量,并将其称为x。然后,您需要使用向量x作为prop.test中的元素,但实际上是将整个列从 Dataframe 传递给prop.test。因为你每次都传递相同的东西,所以你每次都得到相同的(错误的)p值。
此外,由于第一列是字符向量,因此每行都将被强制转换为字符向量,因此除非使用df[-1]跳过apply调用中的第一列,否则数学运算将不起作用
apply的正确用法是:

df$pval <- apply(df[-1], 1, \(x) prop.test(x = x[1:2], n = x[3:4])$p.value)

df
#>   group n_Baseline n_Endline sample_Baseline sample_Endline       pval
#> 1     A        164       158             305            273 0.36387328
#> 2     B         89        65             131            106 0.35495949
#> 3     C         59        68             118            108 0.06758474
#> 4     D         52        48              90             84 1.00000000
#> 5     E        141       107             224            186 0.30960338

问题中的数据为可重现格式

df <- structure(list(group = c("A", "B", "C", "D", "E"), n_Baseline = c(164L, 
89L, 59L, 52L, 141L), n_Endline = c(158L, 65L, 68L, 48L, 107L
), sample_Baseline = c(305L, 131L, 118L, 90L, 224L), sample_Endline = c(273L, 
106L, 108L, 84L, 186L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5"))

相关问题