Проверка разницы между пропорциями в R - PullRequest
0 голосов
/ 23 мая 2019

Я немного смущен проведением теста пропорций в R. Может быть, это супер очевидно, но prop.test ведет себя не так, как я ожидал, и я хотел бы знать, почему и что использовать вместо этого. Приложение находится на наборе данных акций протеста.

Я построил следующий набор данных:

enter image description here

, где имя относится к типу процента рассчитываемых событий. Первый ряд относится к событиям, организованным после выборов (aft_elect_prt). В каждой из этих категорий я рассчитываю количество событий, которые (past_pm1) или не были связаны с группой бывшего премьер-министра (past_pm0). Всего относится к числу событий в наборе данных определенного типа. Share0 - это last_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 для каждой строки. Какую функцию / тест я должен использовать вместо этого?

Это код dput для набора данных:

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")

Я благодарен за любые подсказки!

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Функция 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))

Это вернет список тестовых объектов с таким количеством элементов, сколько у вас есть строк в вашем фрейме данных.

Чтобы извлечь выходные данные из списка в форме фрейма данных, вы можете использовать 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
0 голосов
/ 23 мая 2019

Базовая функция Vectorize может векторизовать функцию, которая не принимает векторы.Обратите внимание на аргумент SIMPLIFY.При значении по умолчанию TRUE результат упрощается до вектора, массива или матрицы, если это возможно.Здесь имеет смысл сохранить его в виде списка.

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

Чтобы извлечь просто p-значений (которые все равны 0, как отмечено в комментариях) и прикрепить их кисходный фрейм данных:

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