繁体   English   中英

计算 dataframe 的多列之间的优势比

[英]Calculating Odds Ratio between multiple columns of a dataframe

我有以下 dataframe:

structure(list(id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
13, 14, 15), var1 = c(1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 
1, 1), var2 = c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1), 
    var3 = c(1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1), var4 = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1), outcome = c(1, 
    1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1)), row.names = c(NA, 
-15L), class = c("tbl_df", "tbl", "data.frame"))

我想安排一个脚本来计算所有列和列结果之间的所有可能的优势比(使用卡方),具有 95% CI 和 p 值。 我怎样才能做到这一点?

我安装了 Epitools,但似乎我需要一个 2x2 列联表,我无法将 function 应用于 dataframe 的列

以下代码执行问题中描述的计算,但 3/4 给出错误。

library(epitools)

cols <- grep("var", names(df1), value = TRUE)
res_list <- lapply(cols, function(v){
  tbl <- table(df1[, c(v, "outcome")])
  tryCatch(oddsratio(x = tbl), error = function(e) e)
})

ok <- !sapply(res_list, inherits, "error")
res_list[ok]

错误都是这样的:

uniroot 中的 simpleError(function(or) { 1 - midp(a1, a0, b1, b0, or) - alpha/2}, interval = interval): f() 端点的值不是相反的符号

可以看到

res_list[!ok]

使用mapply ,您可以使用fisher.test function,它在无法计算优势比时不会失败。

mapply(fisher.test, x=data[, grep("var", names(data))], y=data[,"outcome"])

但是 output 是一个 7x4 矩阵,不能整理成一个好的格式。 但是,我们可以使用lapply对每一列进行 Fisher 检验,然后用扫帚package 整理结果。

library(broom)

cols <- df1[,grep("var", names(df1))]
res_list <- lapply(as.list(cols), function(x) fisher.test(x, y=df1$outcome))
do.call(rbind, lapply(res_list, broom::tidy))

# A tibble: 4 x 6
  estimate p.value conf.low conf.high method                alternative
     <dbl>   <dbl>    <dbl>     <dbl> <chr>                 <chr>      
1     0      1        0          77.9 Fisher's Exact Test ~ two.sided  
2   Inf      0.505    0.204     Inf   Fisher's Exact Test ~ two.sided  
3     2.13   0.608    0.160      37.2 Fisher's Exact Test ~ two.sided  
4   Inf      0.505    0.204     Inf   Fisher's Exact Test ~ two.sided

或者使用dplyrmap ,先重塑然后拆分名称。

library(dplyr)

df1 %>%
  pivot_longer(cols=starts_with("var")) %>%
  split(.$name) %>%
  map(~fisher.test(x=.$value, y=.$outcome)) %>%
  map(tidy) %>%
  map_df(~as_tibble(.))

数据

df1 <- structure(list(id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
13, 14, 15), var1 = c(1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 
1, 1), var2 = c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1), 
    var3 = c(1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1), var4 = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1), outcome = c(1, 
    1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1)), row.names = c(NA, 
-15L), class = c("tbl_df", "tbl", "data.frame"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM