[英]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_percent
和city_total
,我可以簡單地將它們重命名為sugar_percent
和batch_lbs
。 我認為這個參考回答了我的問題,其中 prop.test 似乎是要使用的正確測試。
我的實際問題具有極其非正態分布,但不容易通過代碼復制。
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
,並將計數washed
為sugar_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.