使用apply / apply函数自动进行统计分析

问题描述 投票:2回答:2

我有一个数据框,其中包含5列,每列对应一个调查项目,以及一个分组变量。我的数据框中总共有300个观察值,每个单元格条目代表学生在给定项目上给出的响应。我构造了以下可重现的数据框:

set.seed(14)
Group <- rep(c(0, 1), each = 150)
mydf <- data.frame(replicate(5, sample(0:1,300,rep=TRUE)))
mydf$Group <- Group
mydf$Group <- factor(mydf$Group, levels = c(0, 1), labels = c("Group A", "Group B"))
head(mydf); tail(mydf)
> head(mydf); tail(mydf)
  X1 X2 X3 X4 X5   Group
1  0  1  1  1  0 Group A
2  1  1  1  1  1 Group A
3  1  1  0  1  0 Group A
4  1  0  0  1  1 Group A
5  1  1  0  1  0 Group A
6  1  0  1  1  1 Group A
    X1 X2 X3 X4 X5   Group
295  0  1  1  0  1 Group B
296  0  0  1  0  0 Group B
297  1  1  0  1  0 Group B
298  1  1  0  0  1 Group B
299  0  0  1  0  0 Group B
300  1  1  1  1  1 Group B

我想做的是对每个调查项目进行卡方独立性检验X1X5。到目前为止,我一直在进行以下[对于项目1(X1)]:

mydf$X1 <- factor(mydf$X1, levels = c(0, 1), labels = c("AGREE", "DISAGREE"))
MyTable <- table(mydf$Group, mydf$X1)
addmargins(MyTable)
chisq.test(MyTable, correct = FALSE)

并且我想使用lapply函数(或类似的东西)来自动执行此过程,因此我不必为5个项目中的每一个重复前面的代码。这一点特别重要,因为我有一个类似的数据框,其中包含50个项目,并且我想使用相同的代码来自动化这些分析。关于如何进行的任何建议?我在调出每个变量(例如X1X2等)时遇到了最大的麻烦,但我不确定该怎么做。我最近开始使用R,因此我对这些功能和命令没有足够的了解。任何帮助是极大的赞赏。

r statistics apply lapply
2个回答
2
投票

我们可以使用lapply将列“ X1”循环到“ X5”,然后使用“组”列创建一个table,并创建chisq.test以返回测试结果list

out <- lapply(mydf[paste0("X", 1:5)], function(x) 
    chisq.test(table(mydf$Group,
            factor(x, levels = 0:1, labels = c("AGREE", "DISAGREE"))), 
           correct = FALSE))

sapply(out, `[[`, "p.value")
#       X1         X2         X3         X4         X5 
#0.72875061 0.72888976 0.90732945 0.01525704 0.08243538 

1
投票

这里有一个更好的解决方案,可以使事情井井有条...

library(dplyr)
library(purrr)
library(infer)


# make a simple vector of the variables you want on one side
exexs <- c("X1", "X2", "X3")
# an easy way to keep track of names
names(exexs) <- exexs

# make our own simple function
MyFunction <- function(data, groupvar, var) 
{ 
  infer::chisq_test(formula = as.formula(paste(var, "~", groupvar)), 
                    x = data, 
                    correct = FALSE) # you can pass options to chisq.test
}

# purrr::map(exexs, ~ MyFunction(data = mydf, groupvar = .x, var = "Group"))
purrr::map_dfr(exexs, ~ MyFunction(data = mydf, groupvar = .x, var = "Group"), .id = "Variable") %>% rbind()
#> # A tibble: 3 x 4
#>   Variable statistic chisq_df p_value
#>   <chr>        <dbl>    <int>   <dbl>
#> 1 X1          0.120         1   0.729
#> 2 X2          0.120         1   0.729
#> 3 X3          0.0136        1   0.907

根据您的数据

set.seed(14)
Group <- rep(c(0, 1), each = 150)
mydf <- data.frame(replicate(5, sample(0:1,300,rep=TRUE)))
mydf$Group <- Group
mydf$Group <- factor(mydf$Group, levels = c(0, 1), labels = c("Group A", "Group B"))
© www.soinside.com 2019 - 2024. All rights reserved.