簡體   English   中英

使用`dplyr :: group_by()`為多個組獲取`chisq.test()$ p.value`

[英]Get `chisq.test()$p.value` for several groups using `dplyr::group_by()`

我正在嘗試對dplyr框架內的多個組進行卡方檢驗。 問題是, group_by() %>% summarise()似乎沒什么用處。

模擬數據(結構與問題數據相同,但隨機,因此p.values應該很高)

set.seed(1)
data.frame(partido=sample(c("PRI", "PAN"), 100, 0.6),
       genero=sample(c("H", "M"), 100, 0.7), 
       GM=sample(c("Bajo", "Muy bajo"), 100, 0.8)) -> foo

我想比較由GM定義的幾個組,以查看是否有條件的GM的交叉和通用交叉表的p。值發生變化。

明顯的dplyr方法應該是:

foo %>% 
  group_by(GM) %>% 
  summarise(pvalue=chisq.test(.$partido, .$genero)$p.value)  #just the p.value, so summarise is happy

但是我得到的是未分組數據的p.value,只是次數,而不是每個表的p.value:

# A tibble: 2 × 2 GM pvalue <fctr> <dbl> 1 Bajo 0.8660521 2 Muy bajo 0.8660521

使用過濾器測試每個組,我得到:

foo %>% 
  filter(GM=="Bajo") %$% 
  table(partido, genero) %>% 
  chisq.test()

返回值: X-squared = 0.015655, df = 1, p-value = 0.9004

foo %>% 
  filter(GM=="Muy bajo") %$% 
  table(partido, genero) %>% chisq.test()

返回值: X-squared = 0.50409, df = 1, p-value = 0.4777

dplyr:summarise()可用於具有多個參數的函數,因此這不應該是問題:

data.frame(a=1:10, b=10:1, c=sample(c("Grupo 1", "Grupo 2"), 10, 0.5)) %>% 
    group_by(c) %>% 
    summarise(r=cor(a, b))

就像魅力。 它似乎不適用於chisq.test。

我設法使用tidyr::nest()purrr::map()來獲得嵌套模型所需要的東西,但是我發現代碼很麻煩-至少對我的學生而言。 實際上,我已經投入了很多我們的教學來教他們(數學和編程方面非常有挑戰性的小組)dplyr,以便他們可以盡可能地避免使用向量函數。

foo %>% 
  nest(-GM) %>% 
  mutate(tabla=map(data, ~table(.))) %>% 
  mutate(pvalue=map(tabla, ~chisq.test(.)$p.value)) %>% 
  select(GM, pvalue) %>% 
  unnest()

A tibble: 2 × 2
       GM   pvalue
    <fctr>  <dbl>
1     Bajo  0.9004276
2 Muy bajo  0.4777095

do()也可以do()

foo %>% 
  group_by(GM) %>% 
  do(tidy(chisq.test(.$partido, .$genero)))

Source: local data frame [2 x 5]
Groups: GM [2]
    GM statistic   p.value parameter
<fctr>     <dbl>     <dbl>     <int>
1     Bajo 0.0156553 0.9004276         1
2 Muy bajo 0.5040878 0.4777095         1
# ... with 1 more variables: method <fctr>

如: Fisher和Pearson的獨立性測試

但是,為什么group_by()無法與summarise(chisq.test()$p.value)

dplyr ,無論您處於groupby還是其他狀態,通常都可以使用未加引號的變量名來訪問相關列。 因此,移除.$從存取.$partido.$genero這不需要我得到:

foo %>% 
    group_by(GM) %>% 
    summarise(pvalue= chisq.test(partido, genero)$p.value) 

# A tibble: 2 × 2
        GM    pvalue
    <fctr>     <dbl>
1     Bajo 0.9004276
2 Muy bajo 0.4777095

暫無
暫無

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

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