使用 nest_by 或嵌套,group_by 或循环对 R 中的多个变量执行多个卡方检验(李克特量表)

Using nest_by or nest, group_by or looping to perform several chi square test to several variables in R (likert scales)

假设我的数据集中有这些分类变量。所有变量都与人们对 COVID-19 的关注有关,并进行了两次评估(不同参与者..)。

我的主要目标是检查 time(将“保持不变”)是否与每个 item(经济、社会凝聚力等)的流行程度相关(会有所不同).因此,我需要执行几个卡方检验。

我已经使用 nest_by 遵循了一些说明,但我没有得到正确的结果。 我想在此分析中保留 tidyverse 环境。

主要目标是进行多个卡方检验,例如这个:

ds_plot_likert %>%
  pivot_longer(cols = -c(time),
               names_to = "item", values_to = "response") %>% 
  group_by(item, time, response) %>% 
  summarise(N = n()) %>%
  mutate(pct = N / sum(N)) %>% 
  filter(item == "Children's academic achievement") %>% #need to change all the time...
  xtabs(formula =  pct ~ time  + response, data = .) %>% 
  chisq.test()

但对于我数据集中的所有变量(最好使用 tidyverse)。

谢谢!

下面的代码给了你重现的可能。

ds <- structure(list(time = c("First", "First", "First", "First", "First", 
"First", "First", "First", "First", "First", "First", "First", 
".Second", "First", "First", "First", "First", ".Second", "First", 
"First", "First", "First", "First", "First", "First", "First", 
".Second", "First", "First", ".Second", "First", "First", "First", 
"First", "First", "First", "First", "First", "First", "First", 
".Second", "First", "First", "First", ".Second", ".Second", "First", 
"First", "First", ".Second", ".Second", "First", "First", "First", 
"First", ".Second", ".Second", "First", "First", "First", "First", 
"First", ".Second", "First", "First", "First", "First", ".Second", 
"First", "First", "First", "First", "First", "First", "First", 
".Second", "First", ".Second", "First", "First", "First", "First", 
"First", "First", "First", "First", "First", "First", "First", 
".Second", "First", "First", "First", "First", "First", "First", 
"First", ".Second", ".Second", "First"), Economy = structure(c(4L, 
3L, 3L, 4L, 3L, 4L, 4L, 1L, 3L, 3L, 3L, 3L, 3L, 4L, 3L, 4L, 4L, 
3L, 3L, NA, 2L, 3L, 4L, 3L, 3L, 4L, 4L, 2L, 3L, 4L, 4L, 3L, 2L, 
4L, 2L, 3L, 2L, 3L, 3L, 3L, 2L, 4L, 4L, 3L, 3L, 3L, 4L, 3L, 3L, 
4L, 2L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 3L, 4L, 3L, 2L, 
3L, 3L, 3L, 4L, NA, 2L, 4L, 3L, 4L, 2L, 3L, 3L, 2L, NA, 3L, 2L, 
3L, 2L, 3L, 4L, 3L, 3L, 3L, 3L, 3L, 4L, 3L, 4L, 3L, 3L, 2L, 3L, 
3L, 3L, 4L), .Label = c("Not at all", "A little", "Moderately", 
"Very much"), class = "factor"), `My personal finance` = structure(c(3L, 
2L, 4L, 2L, 4L, 4L, 3L, 2L, 3L, 3L, 2L, 3L, 2L, 4L, 3L, 4L, 4L, 
2L, 3L, NA, 3L, 3L, 4L, 3L, 3L, 4L, 3L, 4L, 3L, 4L, 4L, 3L, 4L, 
3L, 4L, 2L, 2L, 3L, 2L, 2L, 4L, 3L, 4L, 3L, 3L, 3L, 3L, 2L, 2L, 
3L, 2L, 4L, 2L, 3L, 3L, 2L, 3L, 3L, 2L, 2L, 3L, 3L, 4L, 4L, 2L, 
3L, 3L, 4L, 3L, NA, 2L, 3L, 3L, 4L, 2L, 3L, 2L, 3L, NA, 3L, 2L, 
2L, 2L, 3L, 4L, 3L, 2L, 3L, 2L, 2L, 2L, 2L, 4L, 3L, 2L, 2L, 3L, 
3L, 3L, 3L), .Label = c("Not at all", "A little", "Moderately", 
"Very much"), class = "factor"), `My own health` = structure(c(3L, 
2L, 4L, 3L, 4L, 4L, 3L, 4L, 2L, 4L, 3L, 3L, 3L, 4L, 3L, 3L, 4L, 
3L, 2L, NA, 3L, 4L, 3L, 4L, 3L, 2L, 1L, 2L, 3L, 3L, 4L, 2L, 4L, 
2L, 4L, 4L, 3L, 2L, 2L, 4L, 4L, 2L, 4L, 3L, 3L, 2L, 3L, 3L, 2L, 
2L, 3L, 3L, 1L, 3L, 4L, 4L, 3L, 3L, 2L, 2L, 4L, 3L, 3L, 4L, 2L, 
3L, 3L, 4L, 4L, NA, 2L, 2L, 3L, 4L, 1L, 3L, 4L, 3L, NA, 3L, 3L, 
3L, 3L, 3L, 3L, 4L, 4L, 2L, 4L, 2L, 2L, 3L, 4L, 3L, 2L, 3L, 4L, 
2L, 3L, 3L), .Label = c("Not at all", "A little", "Moderately", 
"Very much"), class = "factor"), `My friends and family health` = structure(c(4L, 
3L, 4L, 4L, 4L, 4L, 3L, 4L, 3L, 4L, 3L, NA, 3L, 4L, 3L, 3L, 4L, 
4L, 3L, NA, 3L, 4L, 3L, 4L, 3L, 3L, 2L, 2L, 3L, 4L, 4L, 2L, 4L, 
1L, 4L, 4L, 4L, 4L, 3L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 4L, 3L, 
4L, 3L, 3L, 4L, 3L, 3L, 4L, 3L, 3L, 3L, 2L, 4L, 3L, 4L, 4L, 2L, 
3L, 3L, 4L, 4L, NA, 2L, 4L, 3L, 4L, 2L, 3L, 4L, 3L, NA, 3L, 4L, 
3L, 3L, 4L, 3L, 4L, 4L, 3L, 4L, 3L, 3L, 3L, 3L, 4L, 3L, 3L, 4L, 
4L, 3L, 4L), .Label = c("Not at all", "A little", "Moderately", 
"Very much"), class = "factor"), `Social cohesion` = structure(c(3L, 
3L, 2L, 4L, 4L, 2L, 4L, 4L, 2L, 3L, 3L, 3L, 3L, 4L, 3L, 3L, 4L, 
3L, 3L, NA, 3L, 3L, 4L, 3L, 3L, 2L, 1L, 2L, 2L, 4L, 4L, 3L, 3L, 
1L, 3L, NA, 2L, 3L, 2L, 4L, 4L, 2L, 3L, 3L, 4L, 4L, 3L, 3L, 3L, 
2L, 2L, 3L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 4L, 2L, 
3L, 3L, 3L, 4L, NA, 2L, 3L, 3L, 2L, 1L, 1L, 3L, 2L, NA, 3L, NA, 
3L, 3L, 4L, 2L, 4L, 3L, 1L, 4L, 2L, 4L, 3L, 2L, 4L, 2L, 3L, 4L, 
4L, 2L, 2L), .Label = c("Not at all", "A little", "Moderately", 
"Very much"), class = "factor"), `Food and pharmaceutical drugs` = structure(c(2L, 
3L, 4L, 4L, 3L, 2L, 4L, 1L, 2L, 4L, 3L, NA, 2L, 3L, 3L, 2L, 4L, 
3L, 3L, NA, 3L, 4L, 3L, 3L, 3L, 1L, 1L, 2L, 3L, 4L, 2L, 2L, 4L, 
4L, 4L, 1L, 4L, 2L, 2L, 3L, 4L, 2L, 4L, 3L, 2L, 2L, 3L, 3L, 2L, 
3L, 2L, 3L, 4L, 2L, 2L, 2L, 3L, 3L, 3L, 2L, 4L, 3L, 3L, 4L, 2L, 
3L, 3L, 3L, 4L, NA, 2L, 3L, 2L, 2L, 1L, 1L, 2L, 2L, NA, 1L, 1L, 
2L, 2L, 2L, 1L, 3L, 3L, 2L, 3L, 1L, 2L, 2L, 2L, 4L, 2L, 3L, 3L, 
2L, 1L, 2L), .Label = c("Not at all", "A little", "Moderately", 
"Very much"), class = "factor"), `Price of grocery products` = structure(c(2L, 
2L, 3L, 4L, 3L, 4L, 3L, 2L, 2L, 4L, 3L, 3L, 2L, 4L, 3L, 3L, 4L, 
4L, 3L, NA, 3L, 4L, 3L, 3L, 3L, 2L, 3L, 2L, 3L, 4L, 2L, 4L, 3L, 
4L, 4L, 4L, 4L, 2L, 2L, 3L, 4L, 2L, 4L, 3L, 3L, 3L, 3L, 4L, 2L, 
4L, 2L, 3L, 4L, 2L, 2L, 3L, 4L, 3L, 2L, 3L, 4L, 3L, 4L, 4L, 2L, 
3L, 3L, 4L, 4L, NA, 2L, 3L, 2L, 2L, 2L, 1L, 3L, 3L, NA, 1L, 1L, 
2L, 2L, 3L, 1L, 3L, 4L, 2L, 3L, 2L, 2L, 2L, 2L, 4L, 3L, 3L, 3L, 
4L, 1L, 2L), .Label = c("Not at all", "A little", "Moderately", 
"Very much"), class = "factor"), `Stock prices` = structure(c(2L, 
2L, 2L, 4L, 3L, 2L, 1L, 1L, 3L, 4L, 2L, 2L, 2L, 4L, 3L, 3L, 4L, 
3L, 2L, NA, 1L, 2L, 3L, 3L, 3L, 1L, 1L, 1L, 3L, 1L, 2L, 2L, 2L, 
4L, 4L, 2L, 3L, 2L, 2L, 3L, 2L, 3L, 4L, 3L, 4L, 3L, 3L, 2L, 2L, 
2L, 1L, 3L, 3L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, NA, 2L, 4L, 2L, 
3L, 3L, 4L, 4L, NA, 2L, 2L, 2L, 2L, 2L, 1L, 3L, 3L, NA, 3L, 1L, 
3L, 3L, 4L, 1L, 3L, 4L, 1L, 3L, 1L, 4L, 2L, 2L, 2L, NA, 3L, 2L, 
4L, 1L, 2L), .Label = c("Not at all", "A little", "Moderately", 
"Very much"), class = "factor"), `Children's academic achievement` = structure(c(4L, 
3L, 4L, 1L, NA, NA, 1L, 1L, 1L, 1L, 3L, 3L, 2L, 4L, 3L, 4L, NA, 
4L, 3L, NA, 1L, 1L, 3L, 3L, 3L, 1L, 4L, 1L, 3L, 4L, 3L, 2L, 4L, 
1L, 4L, 1L, 1L, 3L, 2L, 3L, 1L, 2L, 1L, 3L, 2L, 3L, 3L, 3L, 1L, 
1L, 1L, 4L, 1L, 1L, 2L, 3L, 3L, 3L, 3L, 2L, 4L, 3L, 3L, 4L, 2L, 
2L, 1L, 1L, 4L, NA, 2L, 2L, 2L, 4L, 1L, 2L, 1L, 2L, NA, 2L, 1L, 
NA, 3L, 2L, 2L, 1L, 4L, 2L, 3L, 1L, 4L, 1L, 1L, 1L, 3L, 1L, 1L, 
1L, 1L, 2L), .Label = c("Not at all", "A little", "Moderately", 
"Very much"), class = "factor")), class = "data.frame", row.names = c(NA, 
-100L))

您可以将每个 item -

的结果存储在一个列表中
library(dplyr)
library(tidyr)

ds %>%
  pivot_longer(cols = -c(time),
               names_to = "item", values_to = "response") %>% 
  group_by(item, time, response) %>% 
  summarise(N = n()) %>%
  mutate(pct = N / sum(N)) %>% 
  group_by(item) %>% 
  summarise(test = list(xtabs(formula =  pct ~ time  + response, 
                       data = cur_data()) %>% chisq.test())) -> result

result$test

#[[1]]

#   Pearson's Chi-squared test

#data:  .
#X-squared = 0.0099329, df = 3, p-value = 0.9997


#[[2]]
#
#   Pearson's Chi-squared test

#data:  .
#X-squared = 0.026631, df = 3, p-value = 0.9989
#...
#...