我正在尝试对小块内的多个阶层进行卡方检验(或费舍尔检验)。
我尝试调整答案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方法?