簡體   English   中英

如何在 R 中執行獨立性(按比例)的統計雙邊檢驗?

[英]How to Perform Statistical Two-Sided Test for Independence (on Proportion) in R?

我正在嘗試使用卡方檢驗比較 R 中兩個百分比/比例的統計顯着性。 我熟悉卡方的 SAS 方法,其中我為分子提供數據集列,為分母提供另一列,以及用於區分分布 (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()

不幸的是,決賽桌給了我 0 的 p 值,這表明兩個幾乎相同的集合是獨立的/不同的。 我不應該得到 ~1 的 p 值嗎?

    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 值,因為我使用了推薦的樣本大小,但得到了 ~1 的 p 值。

    # 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?

我使用 prop.test 是錯誤還是我誤解了什么? 理想情況下,我更願意跳過匯總步驟並簡單地提供數據框、分子列“sugar_lbs”和分母“batch_lbs”,就像我在 SAS 中所做的那樣——這在 R 中可能嗎?

(對於我剛開始發帖時出現的任何格式問題,我深表歉意)

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

編輯 - 只有比例和樣本大小的示例

我認為我選擇使用正態分布可能分散了原始問題的注意力。 我找到了一個例子,它觸及了我想要問的問題的核心,即如何僅在給定比例/百分比和樣本大小的情況下使用道具測試。 而不是下面的city_percentcity_total ,我可以簡單地將它們重命名為sugar_percentbatch_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

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 ) 是獨立的,但您除以它們的總和,則您已使比率相關。 這以一種批判的方式違反了統計檢驗的假設。 Kronmal 1993“虛假相關性和比率謬誤”涵蓋了這一點。

您生成的數據是獨立正態的,因此不要將它們相加,而是測試與 t 檢驗的差異。

我添加到原始帖子中的斯坦福鏈接回答了我的問題。 我修改了斯坦福的例子,簡單地將變量從city重命名為group ,並將計數washedsugar_lbs 我還將一批翻了一番(或比較小城市與大城市)。 我現在得到預期的高 p 值 (0.65),表明比例不同沒有統計顯着性。

當我添加更多組(以獲得更多自由度)並繼續按比例改變批次大小時,我繼續按預期獲得高 p 值,確認配方相同。 如果我修改任何一組的糖百分比,p 值會立即降至零,表明其中一組是不同的,正如預期的那樣。

最后,在“dplyr”管道中執行 prop.text 時,我發現我不應該使用 rowwise() 步驟,這會導致我的 p 值降至零。 刪除此步驟可得到正確的 p 值。 唯一的缺點是我不知道哪一組是不同的,直到我一次只迭代比較兩組。


#---------------------------------------------------------
# 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM