Как выполнить статистический двусторонний тест на независимость (на пропорции) в R? - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь сравнить два процента / пропорции для статистической значимости в R, используя критерий хи-квадрат. Я знаком с методом SAS для Chi Square, в котором я предоставляю столбец набора данных для числителя, еще один столбец для знаменателя и категориальную переменную для различения guish распределений (A / B).

Однако я получаю неожиданные значения в R, используя некоторые примеры наборов. Когда я тестирую две одинаковые популяции с малыми размерами выборки, я получаю значения p (приблизительно) ноль, где я ожидаю, что значения p будут очень высокими (~ 1).

Ниже приведен мой тестовый набор, в котором я указывал содержание сахара в партии воды: например, «использует ли группа A такое же соотношение сахара, как и в группе B?». Моя настоящая проблема аналогична, когда это не тест типа «проходной сбой», а значения числителя и знаменателя могут сильно различаться между образцами (разные веса сахара и / или воды на образец). Моя первая цель - убедиться, что я могу получить высокое значение p из двух одинаковых наборов. Следующий вопрос заключается в том, при каком размере выборки значение p становится достаточно низким, чтобы указывать на значимость?

        # CREATE 2 NEARLY-EQUAL DISTRIBUTIONS (EXPECTING HIGH P-VALUE FROM PROP.TEST)
    set.seed(108)
    group_A =  tibble(group = "A", sugar_lbs = rnorm(mean = 10, sd = 3, n = 50), batch_lbs = rnorm(mean = 30, sd = 6, n = 50))
    group_B =  tibble(group = "B", sugar_lbs = rnorm(mean = 10, sd = 3, n = 50), batch_lbs = rnorm(mean = 30, sd = 6, n = 50))
    batches <- rbind(group_A, group_B) 

Затем я делаю обобщение для расчета общей тенденции процентного содержания сахара между группами:

    # SUMMARY TOTALS
    totals <- batches %>%
        group_by(group) %>%
        summarize(batch_count = n(),
            batch_lbs_sum = sum(batch_lbs), 
            sugar_lbs_sum = sum(sugar_lbs),
            sugar_percent_overall = sugar_lbs_sum / batch_lbs_sum) %>%
        glimpse()

Затем я поставляю процентное содержание сахара между группами в prop.test, ожидая высокого значения p

    # ADD P-VALUE & CONFIDENCE INTERVAL
    stats <- totals %>%
        rowwise() %>%
        summarize(p_val = prop.test(x = sugar_percent_overall, n =  batch_count, conf.level = 0.95, alternative = "two.sided")$p.value) %>%
        mutate(p_val = round(p_val, digits = 3)) %>%
        mutate(conf_level = 1 - p_val) %>%
        select(p_val, conf_level) %>%
        glimpse()

    # FINAL SUMMARY TABLE
    cbind(totals, stats) %>%
        glimpse()

К сожалению, в финальной таблице мне дается значение p, равное 0, предлагая два почти -идентичные множества независимы / различны. Разве я не должен получить значение p ~ 1?

    Observations: 2
    Variables: 7
    $ group                 <chr> "A", "B"
    $ batch_count           <int> 50, 50
    $ batch_lbs_sum         <dbl> 1475.579, 1475.547
    $ sugar_lbs_sum         <dbl> 495.4983, 484.6928
    $ sugar_percent_overall <dbl> 0.3357992, 0.3284833
    $ p_val                 <dbl> 0, 0
    $ conf_level            <dbl> 1, 1

С другой стороны, я также попытался сравнить рекомендуемый размер выборки из power.prop.test с фактическим prop.test, используя этот рекомендованный размер образца. Это дало мне обратную проблему - я ожидал низкого значения p, так как я использую рекомендуемый размер выборки, но вместо этого получаю значение p ~ 1.

    # COMPARE PROP.TEST NEEDED COUNTS WITH AN ACTUAL PROP.TEXT
    power.prop.test(p1 = 0.33, p2 = 0.34, sig.level = 0.10, power = 0.80, alternative = "two.sided") ## n = 38154
    prop.test(x = c(0.33, 0.34), n = c(38154, 38154), conf.level = 0.90, alternative = "two.sided") ## p = 1 -- shouldn't p be < 0.10?

Использую ли я проп .test неправильно или я что-то неправильно понимаю? В идеале, я бы предпочел пропустить этап суммирования и просто указать фрейм данных, столбец числителя 'sugar_lbs' и знаменатель 'batch_lbs', как я это делаю в SAS - возможно ли это в R?

(Извинения для любых вопросов форматирования, как я новичок в публикации)

-------------------------------- -

РЕДАКТИРОВАТЬ - ПРИМЕР С ТОЛЬКО ПРОПОРЦИЯМИ И РАЗМЕРОМ ОБРАЗЦА

Я думаю, что мой выбор использования нормальных дистрибутивов мог отвлечь от первоначального вопроса. Я нашел пример, который доходит до сути того, что я пытался задать, а именно, как использовать тест пропеллера, учитывая только пропорцию / процент и размер выборки. Вместо city_percent и city_total ниже, я мог бы просто переименовать их в sugar_percent и batch_lbs. Я думаю, что эта ссылка отвечает на мой вопрос, где prop.test кажется правильным тестом для использования.

Моя настоящая проблема имеет крайне ненормальное распространение, но ее нелегко воспроизвести с помощью кода.

ПРИМЕР СТЭНФОРДА (стр. 37-50)

- https://web.stanford.edu/class/psych10/schedule/P10_W7L1

    df <- tibble(city = c("Atlanta", "Chicago", "NY", "SF"), washed = c(1175, 1329, 1169, 1521), not_washed = c(413, 180, 334, 215)) %>%
        mutate(city_total = washed + not_washed,
            city_percent = washed / city_total) %>%
        select(-washed, -not_washed) %>%
        glimpse()

    # STANFORD CALCULATION (p = 7.712265e-35)
    pchisq(161.74, df = 3, lower.tail = FALSE) 

    # PROP TEST VERSION (SAME RESULT, p = 7.712265e-35)
    prop.test(x = df$city_percent * df$city_total, n = df$city_total, alternative = "two.sided", conf.level = 0.95)$p.value

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Документация для prop.test гласит:

Использование prop.test(x, n, p = NULL, alternative = c("two.sided", "less", "greater"), conf.level = 0.95, correct = TRUE)

Аргументы

x вектор подсчетов успехов , одномерная таблица с двумя записями или двумерная таблица (или матрица) с 2 столбцами, дающая количество успехов и неудач соответственно.

n вектор чисел испытания; игнорируется, если x является матрицей или таблицей.

Поэтому, если вы хотите "правильный" тест, вам придется использовать sugar_lbs_sum в качестве x вместо sugar_percent_overall. Вы все равно должны получить какое-то предупреждение о том, что x не является целочисленным, но это не моя главная задача.

Но с точки зрения статистического это совершенно неправильный способ сделать вещи. Вы непосредственно вызываете ложную корреляцию для проверки разницы между двумя величинами, делив их на произвольную сумму. Если образцы (sugar_lbs_sum) являются независимыми, но вы делите их на суммы, вы сделали крысу ios зависимой. Это серьезно нарушает допущения статистического теста. Kronmal 1993 «Ложная корреляция и ошибочное отношение» покрывает это.

Сгенерированные вами данные являются независимыми нормальными, поэтому не суммируйте их, а проверяйте разницу с помощью t-критерия.

0 голосов
/ 02 апреля 2020

Ссылка на Стэнфорд, которую я добавил в исходное сообщение, ответила на мой вопрос. Я изменил пример Стэнфорда, чтобы просто переименовать переменные с city на group, а washed считает sugar_lbs. Я также удвоил одну партию (или сравнил маленький и большой город). Теперь я получаю ожидаемое высокое значение р (0,65), указывающее, что нет статистической значимости того, что пропорции разные.

Когда я добавляю больше групп (для большей степени свободы) и продолжаю пропорционально варьировать размеры партий, я продолжаю получать высокие значения p, как и ожидалось, подтверждая, что рецепт остается тем же. Если я изменяю процентное содержание сахара в какой-либо одной группе, значение p немедленно падает до нуля, указывая, что одна из групп отличается, как и ожидалось.

Наконец, при выполнении prop.text внутри канала 'dplyr' Я обнаружил, что не должен был использовать шаг rowwise (), из-за которого мои p-значения падают до нуля. Удаление этого шага дает правильное значение p. Единственным недостатком является то, что я пока не знаю , какая группа отличается, пока я не сравниваю только 2 группы за раз.


#---------------------------------------------------------
# STANFORD EXAMPLE - MODIFIED TO SUGAR & ONE DOUBLE BATCHED
#--------------------------------------------------------
df <- tibble(group = c("A", "B"), sugar_lbs = c(495.5, 484.7), water_lbs = c(1475.6 - 495.5, 1475.6 - 484.7)) %>%
    mutate(sugar_lbs = ifelse(group == "B", sugar_lbs * 2, sugar_lbs),
        water_lbs = ifelse(group == "B", water_lbs * 2, water_lbs)) %>%
    mutate(batch_lbs = sugar_lbs + water_lbs,
        sugar_percent = sugar_lbs / batch_lbs) %>%
    glimpse()

sugar_ratio_all <- sum(df$sugar_lbs) / (sum(df$sugar_lbs) + sum(df$water_lbs))
water_ratio_all <- sum(df$water_lbs) / (sum(df$sugar_lbs) + sum(df$water_lbs))
dof <- (2 - 1) * (length(df$group) - 1)

df <- df %>%
    mutate(sugar_expected = (sugar_lbs + water_lbs) * sugar_ratio_all,
        water_expected = (sugar_lbs + water_lbs) * water_ratio_all) %>%
    mutate(sugar_chi_sq = (sugar_lbs - sugar_expected)^2 / sugar_expected,
        water_chi_sq = (water_lbs - water_expected)^2 / water_expected) %>%
    glimpse()

q <- sum(df$sugar_chi_sq) + sum(df$water_chi_sq)

# STANFORD CALCULATION
pchisq(q, df = dof, lower.tail = F)

# PROP TEST VERSION (SAME RESULT)
prop.test(x = df$sugar_percent * df$batch_lbs, n = df$batch_lbs, alternative = "two.sided", conf.level = 0.95)$p.value
...