如何在R中执行分层卡方

时间:2019-06-28 18:06:50

标签: r chi-squared

我正在尝试对小块内的多个阶层进行卡方检验(或费舍尔检验)。

我尝试调整答案here,但我对使用小标题内的实例计数感兴趣,而不是按百分比计算。我对所使用的公式不太熟悉,因此不确定如何适应此处编写的内容。这就是我认为的调整,但无法解决

set.seed(1)
df <- tibble(
  Drug = rep(c("Mero", "Vanco"), each=12),
  Service = rep(c("Cardiology", "Urology", "Neurology", "Pediatrics"), each=3, times=2),
  pre_post = rep (c("pre-aso", "post-aso", "post-int"), times = 8),
  LOT = round(runif(24, min=0, max=25), 0)) %>%
  mutate(`LOT >3` = if_else(LOT > 3, 1,  0),
         `LOT <=3` = if_else(LOT < 4, 1,  0)) %>%
  select(Drug, LOT, Service, pre_post, `LOT >3`, `LOT <=3`)

lst <- with(df, split(df, list(Service, pre_post)))
res <- lapply(lst, function(x) chisq.test(x[, -(1:4)]))
sapply(res, "[", "p.value")

理想情况下,相对于pre_post,我将对LOT> 3(vs LOT <= 3)的计数具有卡方值,并按药物和服务进行分层。因此,分层的列联表可能看起来像(数字只是占位符):

Drug = Mero, Service = Cardiology

+----------+---------+----------+
|          | LOT > 3 | LOT <= 3 |
+----------+---------+----------+
| pre-aso  |       1 |        1 |
| post-aso |       1 |        1 |
| post-int |       1 |        1 |
+----------+---------+----------+

我的代码当前给出的是无意义的数字或NaN。我还想知道是否可以按以下方式使用dplyr,但这也不起作用。

t1<- df %>%
  count(Service, Drug, `LOT <=3`) %>%
  table()

编辑

我设法找到了一种使用嵌套小动作的可能方法,并在尝试进行确认时遇到了this。但是,建议的dplyr方法给我一个错误,这就是为什么我在进入嵌套列表之前就放弃了它。

如果我使用下面的代码,即使我将所有内容都指定为因子和水平,也会出现此错误。

df %>%
  select(Service, Drug, pre_post, `LOT <=3`) %>%
  group_by(Service, Drug) %>%
  summarise(pvalue = chisq.test(pre_post, `LOT <=3`)$p.value)

# Error in summarise_impl(.data, dots) : 
#   Evaluation error: 'x' and 'y' must have at least 2 levels.

但是,这可行。

df %>% 
  select(Service, Drug, pre_post, `LOT <=3`) %>%
  nest(-Service, -Drug) %>% 
  mutate(freq = map(data, ~table(.))) %>% 
  mutate(pvalue = map(freq, ~chisq.test(.)$p.value)) %>% 
  select(Service, Drug, pvalue) %>% 
  unnest()

有人想为什么我不能使用更直观的dplyr方法?

0 个答案:

没有答案