用于可视化或过滤 P 值的 Tidy chisq.test 输出的函数
Function for Tidy chisq.test Output for Visualizing or Filtering P-Values
对于数据...
library(productplots)
library(ggmosaic)
代码...
library(tidyverse)
library(broom)
我正在尝试创建整洁的 chisq.test 输出,以便我可以轻松过滤或可视化 p 值。
我正在使用 "happy" 数据集(包含在上面列出的任一软件包中)
对于这个例子,如果我想在所有其他变量上设置 "happy" 变量,我会隔离分类变量(我不打算创建年龄、年份等因素分组,对于这个例子),然后 运行 一个简单的函数。
df<-happy%>%select(-year,-age,-wtssall)
lapply(df,function(x)chisq.test(happy$happy,x)
但是,我想要 "broom" 包的整洁输出,这样我就可以创建一个 p 值数据框来过滤或可视化。
我已经尝试了类似于下面代码的各种组合,希望进一步管道化到 "tidy" 扫帚函数或 "filter" 中,我可以在其中缩小重要的 p 值,或者管道进入 p 值或 chi 统计的 ggplot 条形图。
df%>%summarise_if(is.factor,funs(chisq.test(.,df$happy)$p.value))
...但输出似乎不正确。如果我运行 invidivual chisq.test 分别针对变量,答案是不同的。
那么,有没有一种方法可以轻松比较分类变量,在本例中 "happy" 与所有其他列,以及 return 用于进一步操作和分析的整洁数据框?
使用 dplyr::mutate、tidyr::nest 和 purrr::map 的 Purrr 解决方案会很棒,但我感觉嵌套列表列方法不适用于 chisq.test.
您可以在 tidyverse
工作流程中完成这一切,使用 map
代替 lapply
。不需要 nest
除非您要对数据进行子集化以以某种方式比较结果(例如年龄组)
df <- happy%>%
select(-id, -year,-age,-wtssall) %>%
map(~chisq.test(.x, happy$happy)) %>%
tibble(names = names(.), data = .) %>%
mutate(stats = map(data, tidy))
unnest(df, stats)
# A tibble: 6 × 6
names data statistic p.value parameter method
<chr> <list> <dbl> <dbl> <int> <fctr>
1 happy <S3: htest> 92606.00000 0.000000e+00 4 Pearson's Chi-squared test
2 sex <S3: htest> 11.46604 3.237288e-03 2 Pearson's Chi-squared test
3 marital <S3: htest> 2695.18474 0.000000e+00 8 Pearson's Chi-squared test
4 degree <S3: htest> 659.33013 4.057952e-137 8 Pearson's Chi-squared test
5 finrela <S3: htest> 2374.24165 0.000000e+00 8 Pearson's Chi-squared test
6 health <S3: htest> 2928.62829 0.000000e+00 6 Pearson's Chi-squared test
对于数据...
library(productplots)
library(ggmosaic)
代码...
library(tidyverse)
library(broom)
我正在尝试创建整洁的 chisq.test 输出,以便我可以轻松过滤或可视化 p 值。
我正在使用 "happy" 数据集(包含在上面列出的任一软件包中)
对于这个例子,如果我想在所有其他变量上设置 "happy" 变量,我会隔离分类变量(我不打算创建年龄、年份等因素分组,对于这个例子),然后 运行 一个简单的函数。
df<-happy%>%select(-year,-age,-wtssall)
lapply(df,function(x)chisq.test(happy$happy,x)
但是,我想要 "broom" 包的整洁输出,这样我就可以创建一个 p 值数据框来过滤或可视化。
我已经尝试了类似于下面代码的各种组合,希望进一步管道化到 "tidy" 扫帚函数或 "filter" 中,我可以在其中缩小重要的 p 值,或者管道进入 p 值或 chi 统计的 ggplot 条形图。
df%>%summarise_if(is.factor,funs(chisq.test(.,df$happy)$p.value))
...但输出似乎不正确。如果我运行 invidivual chisq.test 分别针对变量,答案是不同的。
那么,有没有一种方法可以轻松比较分类变量,在本例中 "happy" 与所有其他列,以及 return 用于进一步操作和分析的整洁数据框?
使用 dplyr::mutate、tidyr::nest 和 purrr::map 的 Purrr 解决方案会很棒,但我感觉嵌套列表列方法不适用于 chisq.test.
您可以在 tidyverse
工作流程中完成这一切,使用 map
代替 lapply
。不需要 nest
除非您要对数据进行子集化以以某种方式比较结果(例如年龄组)
df <- happy%>%
select(-id, -year,-age,-wtssall) %>%
map(~chisq.test(.x, happy$happy)) %>%
tibble(names = names(.), data = .) %>%
mutate(stats = map(data, tidy))
unnest(df, stats)
# A tibble: 6 × 6
names data statistic p.value parameter method
<chr> <list> <dbl> <dbl> <int> <fctr>
1 happy <S3: htest> 92606.00000 0.000000e+00 4 Pearson's Chi-squared test
2 sex <S3: htest> 11.46604 3.237288e-03 2 Pearson's Chi-squared test
3 marital <S3: htest> 2695.18474 0.000000e+00 8 Pearson's Chi-squared test
4 degree <S3: htest> 659.33013 4.057952e-137 8 Pearson's Chi-squared test
5 finrela <S3: htest> 2374.24165 0.000000e+00 8 Pearson's Chi-squared test
6 health <S3: htest> 2928.62829 0.000000e+00 6 Pearson's Chi-squared test