测试 R 中比例之间的差异

Testing difference between proportions in R

我对在 R 中进行比例测试感到有点困惑。也许这是非常明显的,但 prop.test 的行为与我预期的不同,我想知道为什么以及应该使用什么。该应用程序在抗议事件的数据集上。

我构建了以下数据集:

其中名称指的是正在计算的事件百分比的类型。第一行是指选举后组织的活动 (aft_elect_prt)。在每个类别中,我计算了与 (past_pm1) 或未与前总理 (past_pm0) 的一组相关联的事件的数量。总数是指特定类型的数据集中的事件数。 Share0 是 past_pm0/total,share1 是 past_pm1/total。

我想检验原假设,即两股之间在统计上没有显着差异。

阅读prop.test的文档我设置为:

prop.test(x = as.numeric(subseted$past_pm1),
          n = subseted$total,
          p = subseted$share0,
          alternative = "two.sided",
          conf.level = 0.95)

但是,这显然不能测试我想要的。它还只会产生一个 p 值,而我想为每一行提取一个 p 值。 function/test 我应该改用什么?

这是数据集的输入代码:

structure(list(names = c("aft_elect_prt", "ANSM", "bef_elect_prt", 
"big_event", "conf_viol", "coorg", "demo_petition", "economic", 
"NSM", "political"), past_pm0 = c(49.66101, 78.54659, 65.57226, 
49.67205, 39.641924, 69.52704, 286.8565, 68.53114, 100.00488, 
117.97347), past_pm1 = c(33.796, 14.30855, 34.40608, 31.14065, 
9.017051, 30.64896, 120.4515, 20.86095, 19.00836, 71.24065), 
    total = c(83.4570157825947, 92.8551414906979, 99.9783371835947, 
    80.8127028793097, 48.6589741557837, 100.176002234221, 407.307988807559, 
    89.3920872062445, 119.013234868646, 189.21411934495), share0 = c(0.595048954654295, 
    0.8459045857775, 0.655864678761227, 0.614656461548911, 0.814688856223823, 
    0.69404885850245, 0.704274180429913, 0.766635416419863, 0.84028368870382, 
    0.623491895892433), share1 = c(0.404950976057405, 0.154095398168484, 
    0.344135349408928, 0.385343502821669, 0.185311161125829, 
    0.305951119194593, 0.295725847049147, 0.233364614832964, 
    0.159716354412006, 0.376508107569518)), row.names = c(NA, 
-10L), class = "data.frame")

prop.test 函数未向量化。它进行一次测试。您需要将函数显式映射到数据框的每一行。您可以为此使用基本 R 函数或 tidyverse 函数。以下是您在 tidyverse 中的操作方法,使用 purrr::pmap 将函数应用于数据框的每一行。

library(purrr)
prop_test_list <- pmap(subseted, function(past_pm1, total, ...) prop.test(x = past_pm1, n = total, alternative = 'two.sided', conf.level = 0.95))

这将 return 一个测试对象列表,其中包含与数据框中的行一样多的元素。

要以数据框形式从列表中提取输出,您可以使用purrr::map_dfr。这是一个包含一些汇总统计信息的示例:

map_dfr(prop_tests, ~ data.frame(p = .x$p.value, estimate = .x$estimate, confint_min = .x$conf.int[1], confint_max = .x$conf.int[2]))

输出:

   p            estimate   confint_min confint_max
1  1.037002e-01 0.4049510  0.30058839   0.5181435
2  5.288024e-11 0.1540954  0.09038891   0.2472255
3  2.553365e-03 0.3441353  0.25382739   0.4465844
4  5.115352e-02 0.3853435  0.28114139   0.5005436
5  2.167205e-05 0.1853112  0.09330970   0.3274424
6  1.540307e-04 0.3059511  0.21985913   0.4071514
7  2.490965e-16 0.2957258  0.25231710   0.3430569
8  7.967215e-07 0.2333646  0.15312169   0.3369412
9  2.252910e-13 0.1597164  0.10130585   0.2407265
10 8.851678e-04 0.3765081  0.30807997   0.4500369

基函数 Vectorize 可以向量化不接受向量的函数。注意 SIMPLIFY 参数。使用默认值 TRUE,如果可能,结果将简化为向量、数组或矩阵。在这里,将其保留为列表更有意义。

vprop.test <- Vectorize(prop.test, SIMPLIFY = FALSE)
ans <- with(subseted, vprop.test(x = past_pm1, n = total))

要提取 just p-values(如评论中所述均为 0)并将它们附加到原始数据框:

subseted$p.value <- sapply(ans, "[[", "p.value")