我的目标是用更少的时间做卡方检验.

data <- data.frame(
  sex = factor(c("M", "F", "M")),
  ageid = factor(c(8, 6, 7)),
  married = factor(c(2, 1, 2)),
  cagv_typ = factor(c("non-primary", "primary", "non-primary")),
  sq5_1 = factor(c(1, 1, 1)),
  sq5_2 = factor(c(0, 1, 0))
)

在这个数据框架中,性别和已婚是可变的,其余的是结果.事实上,我有10多个结果变量和5个亚组变量.

首先,我根据这里所示的示例编写了以下代码 https://epirhandbook.com/en/simple-statistical-tests.html#chi-squared-test-1

library(rstatix)
chis_test <- function(data, var1, var2){
  result <- data %>%
    tabyl({{var1}}, {{var2}}) %>%
    select(-1) %>% 
    chisq_test()
  return(result)
}

接下来,我try 使用EXPAND_GRID()获取所有可能的组合:

combo <- expand_grid(x = names(data)[c(1, 3)], y = names(data)[-c(1, 3)])

结果如下(其他实际变量也显示):

             x          y
1      cagv_typ      ageid
2           sex      ageid
3   cset_typ_bi      ageid
4     lv_eas_bi      ageid
5    und_con_bi      ageid
6    sup_ard_bi      ageid
7    job_inf_bi      ageid
8      cagv_typ    married
9           sex    married
10  cset_typ_bi    married
11    lv_eas_bi    married
12   und_con_bi    married
13   sup_ard_bi    married
14   job_inf_bi    married

我还try 了一个带有代码的性和CAGV_tpy组合:

chis_test(sq_catvar, sex, cagv_typ)

它返回了我想要的结果:

n  statistic  p      df    method        p.signif 
267  55.8   7.87e-14  1 Chi-square test   **** 

但当我使用Apply()时,它失败了:

apply(combo, 1, function(x) chis_test(data, x[1], x[2]))

我想知道出了什么问题.提前谢谢您!

谨致问候

推荐答案

除了@Onyambu的 comments ,这里还有一个整齐的方法(可能更容易理解/理解):

library(purrr)
library(tidyr)

data <- data.frame(
  sex = factor(c("M", "F", "M")),
  ageid = factor(c(8, 6, 7)),
  married = factor(c(2, 1, 2)),
  cagv_typ = factor(c("non-primary", "primary", "non-primary")),
  sq5_1 = factor(c(1, 1, 1)),
  sq5_2 = factor(c(0, 1, 0))
)

var_names_x <- c("sex", "married")
var_names_y <- names(data)[!names(data) %in% var_names_x]
data_var_names <- tidyr::expand_grid(x_var = var_names_x, y_var = var_names_y)

purrr::map2(.x = data_var_names$x_var,
            .y = data_var_names$y_var,
            .f = ~chisq.test(table(data[[.x]], data[[.y]])))

编辑: 你想要一种很好地提取p值的方法.为了做到这一点,我们可以保存map2()的结果,并使用sapply()map_dbl().

res <- purrr::map2(.x = data_var_names$x_var,
                   .y = data_var_names$y_var,
                   .f = ~chisq.test(table(data[[.x]], data[[.y]])))

data_var_names$pval <- unlist(sapply(res, "[", "p.value"))
## OR:
data_var_names$pval <- map_dbl(res, "p.value")

结果是:

> data_var_names
# A tibble: 8 x 3
  x_var   y_var     pval
  <chr>   <chr>    <dbl>
1 sex     ageid    0.223
2 sex     cagv_typ 0.665
3 sex     sq5_1    0.564
4 sex     sq5_2    0.665
5 married ageid    0.223
6 married cagv_typ 0.665
7 married sq5_1    0.564
8 married sq5_2    0.665

R相关问答推荐

我可以截断10字节的扩展数并转换为8字节的double吗?

变量计算按R中的行更改

根据列表中项目的名称多次合并数据框和列表

ggplot geom_smooth()用于线性回归虚拟变量-没有回归线

MCMC和零事件二元逻辑回归

多重RHS固定估计

将嵌套列表子集化为嵌套列表

如何直接从R中的风险分数计算c指数?

在R中无法读入具有Readxl和lApply的数据集

如果某些列全部为NA,则更改列

为什么我的基准测试会随着样本量的增加而出现一些波动?

传递ggplot2的变量作为函数参数—没有映射级别以正确填充美学

根据类别合并(汇总)某些行

悬崖三角洲超大型群数计算导致整数溢出

派生程序包| ;无法检索';return()';的正文

如何提取R中其他字符串和数字之间的字符串?

是否有一个R函数可以输出在输入的字符向量中找到的相应正则表达式模式?

R:使用ApexCharge更改标签在饼图中的位置

每行不同列上的行求和

具有自定义仓位限制和计数的GGPLATE直方图