r - 以整洁的方式通过 tibble 运行 aov 测试
问题描述
我想使用相同的因变量对数据框进行线性回归。一个类似的问题在这里得到了解决。问题是aov
实现方差分析的函数不接受x
和y
作为参数(据我所知)。有没有办法以整洁的方式实施分析?到目前为止,我已经尝试过类似的东西:
library(tidyverse)
iris %>%
as_tibble() %>%
select(Sepal.Length, Species) %>%
mutate(foo_a = as_factor(sample(c("a", "b", "c"), nrow(.), replace = T)),
foo_b = as_factor(sample(c("d", "e", "f"), nrow(.), replace = T))) %>%
map(~aov(Sepal.Length ~ .x, data = .))
由reprex 包(v0.2.1)于 2019 年 2 月 12 日创建
所需的输出是三个分析:Sepal.Length
和Species
,Sepal.Length
以及foo_a
最后一个Sepal.Length
和foo_b
。有可能还是我完全错了?
解决方案
一种方法是将其制成长形数据框,按感兴趣的自变量分组,并使用“多模型”方法。我通常更喜欢这样的事情,而不是尝试跨多个列进行 tidyeval ——它只是让我更清楚地了解正在发生的事情。
为了节省空间,我正在使用iris_foo
,这是您通过 2 条 mutate 行创建的数据。aov
将其转换为长格式会为您提供这三列名称的键,这些名称将在每次调用中用作自变量。
library(tidyverse)
iris_foo %>%
gather(key, value, -Sepal.Length)
#> # A tibble: 450 x 3
#> Sepal.Length key value
#> <dbl> <chr> <chr>
#> 1 5.1 Species setosa
#> 2 4.9 Species setosa
#> 3 4.7 Species setosa
#> 4 4.6 Species setosa
#> 5 5 Species setosa
#> 6 5.4 Species setosa
#> 7 4.6 Species setosa
#> 8 5 Species setosa
#> 9 4.4 Species setosa
#> 10 4.9 Species setosa
#> # … with 440 more rows
从那里,嵌套key
并创建一个新的 ANOVA 模型列表列。这将是一个aov
对象列表。为简单起见,您可以删除数据列。
aov_models <- iris_foo %>%
gather(key, value, -Sepal.Length) %>%
group_by(key) %>%
nest() %>%
mutate(model = map(data, ~aov(Sepal.Length ~ value, data = .))) %>%
select(-data)
aov_models
#> # A tibble: 3 x 2
#> key model
#> <chr> <list>
#> 1 Species <S3: aov>
#> 2 foo_a <S3: aov>
#> 3 foo_b <S3: aov>
从那里,您可以随心所欲地使用模型。它们可以在列表中访问aov_models$model
。印刷后,它们看起来像您期望的那样。例如第一个模型:
aov_models$model[[1]]
#> Call:
#> aov(formula = Sepal.Length ~ value, data = .)
#>
#> Terms:
#> value Residuals
#> Sum of Squares 63.21213 38.95620
#> Deg. of Freedom 2 147
#>
#> Residual standard error: 0.5147894
#> Estimated effects may be unbalanced
要查看所有模型,请调用aov_models$model %>% map(print)
。您可能还想使用broom
函数,例如broom::tidy
或broom::glance
,这取决于您需要如何呈现模型。
aov_models$model %>%
map(broom::tidy)
#> [[1]]
#> # A tibble: 2 x 6
#> term df sumsq meansq statistic p.value
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 value 2 63.2 31.6 119. 1.67e-31
#> 2 Residuals 147 39.0 0.265 NA NA
#>
#> [[2]]
#> # A tibble: 2 x 6
#> term df sumsq meansq statistic p.value
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 value 2 0.281 0.141 0.203 0.817
#> 2 Residuals 147 102. 0.693 NA NA
#>
#> [[3]]
#> # A tibble: 2 x 6
#> term df sumsq meansq statistic p.value
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 value 2 0.756 0.378 0.548 0.579
#> 2 Residuals 147 101. 0.690 NA NA
或者将所有模型整理到一个数据框中,保留该key
列,您可以这样做:
aov_models %>%
mutate(model_tidy = map(model, broom::tidy)) %>%
unnest(model_tidy)
推荐阅读
- google-chrome - Chrome 下拉菜单错误(自动关闭)
- .net - 初始项目构建给出错误 CS 2001 .cshtml.g.cs 找不到
- python - 具有多个 OrderedDictkeys 的 Python xmltodict
- c# - 将带有类的字典保存到文件
- python - 如何在python中的函数内创建模块级全局变量
- iis - URL重写导致重定向你太多次
- node.js - puppeteer 在谷歌应用引擎的生产中发送错误 500
- javascript - 如何添加样式或类名并从 Web 组件中删除其他元素?
- intellij-idea - IntelliJ IDEA 内部错误“Equal objects must have equal hashcodes”(作者 Trove)
- sql - 重用 T-SQL FOR JSON 子查询