测试 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")
我对在 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")