如何在宽格式data.frame上运行ANOVA?

时间:2018-04-29 23:03:50

标签: r dataframe reshape anova

我被教导使用以下公式运行方差分析: aov(因变量〜自变量,数据集)

但我正在努力解决如何为特定数据集运行ANOVA,因为它分为三列,每列包含一个值。三列被指定为新生儿,青少年和成年人(这是仓鼠年龄),每列中的值代表血压值。我需要进行一项测试,以确定血压和年龄之间是否存在关系。

这是R中的数据:

> hamster
   Newborn adolescent adult
1      108        110   105
2      110        105   100
3       90        100    95
4       80         90    85
5      100        102    97
6      120        110   105
7      125        105   100
8      130        115   110
9      120        100    95
10     130        120   115
11     145        130   125
12     150        125   120
13     130        135   130
14     155        130   125
15     140        120   115

因为因变量是每列中的值^而感到困惑

3 个答案:

答案 0 :(得分:6)

第一步是重新排列您的数据,以便在#34; long"格式而不是"宽"格式。这可以使用reshape函数在基础R中完成,但使用gather包中的tidyr函数要容易得多:

library(tidyr)
result <- hampster %>%
  gather(age, bp) %>%
  aov(bp ~ age, .)

使用tidyr还为我们提供了管道运算符(%>%),让您以一种漂亮的方式将命令链接在一起。默认情况下,它通过获取前一个函数的结果并将其作为下一个函数的第一个参数插入来工作。在aov函数中,我们使用.运算符覆盖此函数,以明确地将gather函数生成的数据集作为第二个参数。

答案 1 :(得分:5)

R有一个名为stack的有用功能,可将您的数据格式转换为ANOVA所需的格式。

aov(values ~ ind, stack(hamster))

# Call:
#
# aov(formula = values ~ ind, data = stack(hamster))
#
# Terms:
#                       ind Residuals
# Sum of Squares   1525.378 11429.867
# Deg. of Freedom         2        42
#
# Residual standard error: 16.49666
# Estimated effects may be unbalanced

答案 2 :(得分:2)

在主题变量内运行重复度量方差分析的代码,主题变量之间没有差异,如下所示。请注意,我们使用group_by()包中的dplyr来保留仓鼠ID号,以便我们可以将其用作ANOVA中的错误词。

hamsterData <- "id   Newborn adolescent adult
1      108        110   105
2      110        105   100
3       90        100    95
4       80         90    85
5      100        102    97
6      120        110   105
7      125        105   100
8      130        115   110
9      120        100    95
10     130        120   115
11     145        130   125
12     150        125   120
13     130        135   130
14     155        130   125
15     140        120   115"

hamster <- read.table(text = hamsterData,header = TRUE )
library(tidyr)
library(dplyr)
result <- hamster %>% group_by(id) %>%
     gather(age,bp, Newborn,adolescent,adult)
result$age <- factor(result$age,levels=c("Newborn","adolescent","adult"))
options(contrasts=c("contr.sum","contr.poly"))
modelAOV <- aov(bp ~ age + Error(factor(id)),data = result)
summary(modelAOV)

...和输出:

> modelAOV <- aov(bp ~ age + Error(factor(id)),data = result)
> summary(modelAOV)

Error: factor(id)
          Df Sum Sq Mean Sq F value Pr(>F)
Residuals 14  10013   715.2               

Error: Within
          Df Sum Sq Mean Sq F value  Pr(>F)    
age        2   1525   762.7   15.07 3.6e-05 ***
Residuals 28   1417    50.6                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
>