R语言 中比较均值
在数据分析中,有很多情况下你会想比较两个种群或样本的均值,你应该使用哪种技术取决于你有什么类型的数据以及这些数据是如何分组的。均值比较检验有助于确定你的群体是否具有相似的均值。因此,本文包含了 在 R编程 中用于比较平均值 的统计测试 。 这些测试包括。
- T检验
- Wilcoxon检验
- ANOVA测试
- Kruskal-Wallis测试
在R编程中比较均值
正如我们之前所讨论的,各种技术的使用取决于我们拥有的数据类型和数据的分组方式。因此,让我们根据不同类型的数据逐一讨论这些技术。
比较单样本数据的平均值
主要有两种技术用于比较一个样本的平均值和一个标准的已知平均值。这两种技术是。
- 单样本T检验
- 单样本Wilcoxon检验
单样本T检验
单样本T检验用于检验样本平均数与群体中已知或假定/假设的平均数值之间的统计差异。
在R中实现。
要在R中进行单样本T检验,请使用函数t.test()。该函数的语法如下。
语法: t.test(x, mu = 0)
参数
- x:所关注的变量的名称
- mu:设置为等于无效假设所指定的平均值。
例子
# R program to illustrate
# One sample t-test
set.seed(0)
sweetSold <- c(rnorm(50, mean = 140, sd = 5))
# Ho: mu = 150
# Using the t.test()
result = t.test(sweetSold, mu = 150)
# Print the result
print(result)
输出
One Sample t-test
data: sweetSold
t = -15.249, df = 49, p-value < 2.2e-16
alternative hypothesis: true mean is not equal to 150
95 percent confidence interval:
138.8176 141.4217
sample estimates:
mean of x
140.1197
单样本Wilcoxon检验
单样本Wilcoxon符号秩检验是当数据不能被假定为正态分布时,单样本t检验的非参数化替代方法。它用于确定样本的中位数是否等于一个已知的标准值,即一个理论值。
在R中实现
为了进行单样本Wilcoxon测试,R提供了一个函数 wilcox.test() ,可以按以下方式使用。
语法: wilcox.test(x, mu = 0, alternative = “two.sided”)
参数:
- x:一个包含你的数据值的数字向量
- mu:理论上的平均值/中位数值。默认为0,但你可以改变它。
- alternative:替代假设。允许的值是 “两面”(默认)、”更大 “或 “更小 “中的一个。
例子: 这里,让我们使用一个包含10只兔子体重的数据集的例子。让我们知道兔子的中位数重量是否与25g不同?
# R program to illustrate
# one-sample Wilcoxon signed-rank test
# The data set
set.seed(1234)
myData = data.frame(
name = paste0(rep("R_", 10), 1:10),
weight = round(rnorm(10, 30, 2), 1)
)
# Print the data
print(myData)
# One-sample wilcoxon test
result = wilcox.test(myData$weight, mu = 25)
# Printing the results
print(result)
输出
name weight
1 R_1 27.6
2 R_2 30.6
3 R_3 32.2
4 R_4 25.3
5 R_5 30.9
6 R_6 31.0
7 R_7 28.9
8 R_8 28.9
9 R_9 28.9
10 R_10 28.2
Wilcoxon signed rank test with continuity correction
data: myData$weight
V = 55, p-value = 0.005793
alternative hypothesis: true location is not equal to 25
在上述输出中,检验的p值为0.005793,小于显著性水平α=0.05。所以我们可以拒绝无效假设,并得出结论:兔子的平均体重与25克有显著差异,P值=0.005793。
比较成对样本的平均值
主要有两种技术用于比较成对样本的平均值。这两种技术是。
- 成对样本T检验
- 成对样本Wilcoxon检验
成对样本T检验
这是一个统计程序,用于确定两组观察值之间的平均差异是否为零。在配对样本T检验中,每个受试者被测量两次,产生成对的观察值。
在R中实现
要在R中进行单样本t检验,请使用函数 t. test()。 该函数的语法如下所示。
语法: t.test(x, y, paired =TRUE)
参数
- x, y:数字向量
- paired:一个逻辑值,指定我们要计算一个成对的t检验。
例子
# R program to illustrate
# Paired sample t-test
set.seed(0)
# Taking two numeric vectors
shopOne <- rnorm(50, mean = 140, sd = 4.5)
shopTwo <- rnorm(50, mean = 150, sd = 4)
# Using t.tset()
result = t.test(shopOne, shopTwo,
var.equal = TRUE)
# Print the result
print(result)
输出
Two Sample t-test
data: shopOne and shopTwo
t = -13.158, df = 98, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-11.482807 -8.473061
sample estimates:
mean of x mean of y
140.1077 150.0856
成对样本Wilcoxon检验
成对样本Wilcoxon检验是成对t检验的一个非参数替代方法,用于比较成对的数据。当数据不是正态分布时,它就会被使用。
在R中实现
为了进行配对样本Wilcoxon检验,R提供了一个函数 wilcox.test() ,可以如下使用。
语法: wilcox.test(x, y, paired = TRUE, alternative = “two.sided”)
参数
- x, y:数字向量
- paired:一个逻辑值,指定我们要计算一个成对的Wilcoxon检验。
- alternative :替代假设。允许的值是 “两面”(默认)、”大 “或 “小 “中的一个。
例子: 在这里,让我们使用一个数据集的例子,其中包含10只兔子在治疗前后的体重。我们想知道,治疗前后的体重中位数是否有明显差异?
# R program to illustrate
# Paired Samples Wilcoxon Test
# The data set
# Weight of the rabbit before treatment
before <-c(190.1, 190.9, 172.7, 213, 231.4,
196.9, 172.2, 285.5, 225.2, 113.7)
# Weight of the rabbit after treatment
after <-c(392.9, 313.2, 345.1, 393, 434,
227.9, 422, 383.9, 392.3, 352.2)
# Create a data frame
myData <- data.frame(
group = rep(c("before", "after"), each = 10),
weight = c(before, after)
)
# Print all data
print(myData)
# Paired Samples Wilcoxon Test
result = wilcox.test(before, after, paired = TRUE)
# Printing the results
print(result)
输出
group weight
1 before 190.1
2 before 190.9
3 before 172.7
4 before 213.0
5 before 231.4
6 before 196.9
7 before 172.2
8 before 285.5
9 before 225.2
10 before 113.7
11 after 392.9
12 after 313.2
13 after 345.1
14 after 393.0
15 after 434.0
16 after 227.9
17 after 422.0
18 after 383.9
19 after 392.3
20 after 352.2
Wilcoxon signed rank test
data: before and after
V = 0, p-value = 0.001953
alternative hypothesis: true location shift is not equal to 0
在上述输出中,检验的p值为0.001953,小于显著性水平α=0.05。我们可以得出结论,治疗前的小鼠体重中位数与治疗后的体重中位数有显著差异,P值=0.001953。
比较两组以上的平均值
主要有两种技术用于比较一个样本的平均值和一个标准的已知平均值。这两种技术是。
- 方差分析(ANOVA)
- 单向方差分析
- 双向方差分析
- MANOVA测试
- 克鲁斯卡-瓦利斯测试
单向方差分析
单向方差分析(ANOVA), 也被称为单因素方差分析,是独立双样本t检验的延伸,用于在有两个以上组的情况下比较平均值。在单因素方差分析中,数据被组织成基于一个单一分组变量的若干组。
在R中实现
在R中执行单向方差分析(ANOVA)时,使用函数 aov()。 函数 summary.aov() 用于总结方差模型的分析结果。该函数的语法如下。
语法: aov(formula, data = NULL)
参数
- formula。一个指定模型的公式。
- data。一个数据框,其中将找到公式中指定的变量。
例子
使用预先安装了dplyr包的mtcars数据集,在连续属性disp和分类属性gear之间进行单因素方差分析测试。
# R program to illustrate
# one way ANOVA test
# Loading the package
library(dplyr)
# Calculate test statistics using aov function
mtcars_aov <- aov(mtcars disp ~ factor(mtcars gear))
print(summary(mtcars_aov))
输出
Df Sum Sq Mean Sq F value Pr(>F)
factor(mtcars$gear) 2 280221 140110 20.73 2.56e-06 ***
Residuals 29 195964 6757
—
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
总结显示,齿轮属性对位移非常显著(三颗星表示)。另外,P值小于0.05,所以它证明齿轮对位移是显著的,即相互关联,我们拒绝了无假设。
双向方差分析
双向方差分析测试用于同时评估两个分组变量(A和B)对响应变量的影响。它考虑到了两个分类组。
在R中实现
要在R中进行双向方差分析(ANOVA),也可以使用函数aov()。函数summary.aov()是用来总结方差分析模型的。该函数的语法如下。
语法: aov(formula, data = NULL)
参数
- formula。一个指定模型的公式。
- data。一个数据框,其中将找到公式中指定的变量。
例子: 使用预先安装了dplyr软件包的mtcars数据集,在连续属性disp和分类属性gear以及分类属性am之间进行双向方差分析测试。
# R program to illustrate
# two way ANOVA test
# Loading the package
library(dplyr)
# Calculate test statistics using aov function
mtcars_aov2 = aov(mtcars disp ~ factor(mtcars gear) *
factor(mtcars $ am))
print(summary(mtcars_aov2))
输出
Df Sum Sq Mean Sq F value Pr(>F)
factor(mtcarsgear) 2 280221 140110 20.695 3.03e-06 ***
factor(mtcarsam) 1 6399 6399 0.945 0.339
Residuals 28 189565 6770
—
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
总结显示,齿轮属性对位移非常显著(三颗星表示),AM属性对位移不大显著。齿轮的P值小于0.05,所以它证明了齿轮对位移是显著的,即相互关联的。凸轮的P值大于0.05,凸轮对位移不显著,即相互之间没有关系。
MANOVA测试
多变量方差分析(MANOVA) 是简单的带有多个因变量的方差分析(Analysis of Variance)。它是方差分析的一个延续。在方差分析中,我们通过一个独立分组变量测试一个连续因变量的统计差异。MANOVA是这种分析的延续,它采用多个连续因变量,并将它们共同捆绑在一个加权的线性综合变量中。MANOVA比较了新创建的组合是否因自变量的不同水平或组别而不同。
在R中实现
R提供了一个方法 manova() 来执行MANOVA测试。类 “manova “与类 “aov “的不同之处在于选择了一种不同的总结方法。函数manova()调用aov,然后将类 “manova “添加到每个分层的结果对象中。
语法: manova(formula, data = NULL, projections = FALSE, qr = TRUE, contrasts = NULL, …)
参数
- formula。一个指定模型的公式。
- data 。一个数据框架,其中将找到公式中指定的变量。如果缺失,将以标准方式搜索变量。
- projections 。逻辑标志
- qr。逻辑标志
- contrasts 。
……用于公式中某些因素的对比列表。传递给lm的参数,如subset或na.action。
例子: 为了在R中进行MANOVA测试,让我们采取虹膜数据集。
# R program to illustrate
# MANOVA test
# Import required library
library(dplyr)
# Taking iris data set
myData = iris
# Show a random sample
set.seed(1234)
dplyr::sample_n(myData, 10)
输出
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.5 2.5 4.0 1.3 versicolor
2 5.6 2.5 3.9 1.1 versicolor
3 6.0 2.9 4.5 1.5 versicolor
4 6.4 3.2 5.3 2.3 virginica
5 4.3 3.0 1.1 0.1 setosa
6 7.2 3.2 6.0 1.8 virginica
7 5.9 3.0 4.2 1.5 versicolor
8 4.6 3.1 1.5 0.2 setosa
9 7.9 3.8 6.4 2.0 virginica
10 5.1 3.4 1.5 0.2 setosa
为了了解不同物种之间在萼片和花瓣的长度上是否存在任何重要的差异,然后进行MANOVA测试。因此,可以使用函数 manova() ,如下所示。
# Taking two dependent variable
sepal = irisSepal.Length
petal = irisPetal.Length
# MANOVA test
result = manova(cbind(Sepal.Length, Petal.Length) ~ Species,
data = iris)
summary(result)
输出
Df Pillai approx F num Df den Df Pr(>F)
Species 2 0.9885 71.829 4 294 < 2.2e-16 ***
Residuals 147
—
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
从上面的输出结果可以看出,两个变量在物种之间有高度显著的差异。
Kruskal-Wallis检验
Kruskal-Wallis检验 是一种基于等级的检验,与Mann-Whitney U检验相似,但可以应用于有两组以上的单程数据。它是单向方差分析检验的一个 非参数 替代方法,它扩展了双样本Wilcoxon检验。如果一组数据样本来自不相关的人群,并且样本之间互不影响,那么它们就是独立的。使用Kruskal-Wallis检验,可以决定群体分布是否相似,而不需要假设它们遵循正态分布。
在R中实现 。
R提供了一个方法 kruskal.test() ,在stats包中可以用来进行Kruskal-Wallis等级和检验。
语法: kruskal.test(x, g, formula, data, subset, na.action, …)
参数
- x:一个数据值的数字向量,或一个数字数据向量的列表。
- g:一个矢量或因子对象,给出了x的相应元素的组。
- formula:一个形式为response ~ group的公式,其中response给出了数据值,group是相应组的向量或因子。
- data:一个可选的矩阵或数据框,包含公式中的变量。
- subset:一个可选的向量,指定要使用的观察结果的子集。
- na.action:一个函数,表示当数据包含NA时应该发生什么。
- …:进一步的参数,可以传递给方法或从方法中传递。
例如: 让我们使用名为PlantGrowth的内置R数据集。它包含了在控制和两种不同处理条件下获得的植物的重量。
# Preparing the data set
# to perform Kruskal-Wallis Test
# Taking the PlantGrowth data set
myData = PlantGrowth
print(myData)
# Show the group levels
print(levels(myData$group))
输出
weight group
1 4.17 ctrl
2 5.58 ctrl
3 5.18 ctrl
4 6.11 ctrl
5 4.50 ctrl
6 4.61 ctrl
7 5.17 ctrl
8 4.53 ctrl
9 5.33 ctrl
10 5.14 ctrl
11 4.81 trt1
12 4.17 trt1
13 4.41 trt1
14 3.59 trt1
15 5.87 trt1
16 3.83 trt1
17 6.03 trt1
18 4.89 trt1
19 4.32 trt1
20 4.69 trt1
21 6.31 trt2
22 5.12 trt2
23 5.54 trt2
24 5.50 trt2
25 5.37 trt2
26 5.29 trt2
27 4.92 trt2
28 6.15 trt2
29 5.80 trt2
30 5.26 trt2
[1] "ctrl" "trt1" "trt2"
这里 “组 “一栏被称为因子,不同的类别(”ctr”、”rt1″、”rt2″)被称为因子级别。这些级别是按字母顺序排列的。问题陈述是我们想知道在3个实验条件下植物的平均重量是否有显著差异。可以用下面的函数kruskal.test()进行检验。
# R program to illustrate
# Kruskal-Wallis Test
# Taking the PlantGrowth data set
myData = PlantGrowth
# Performing Kruskal-Wallis test
result = kruskal.test(weight ~ group,
data = myData)
print(result)
输出
Kruskal-Wallis rank sum test
data: weight by group
Kruskal-Wallis chi-squared = 7.9882, df = 2, p-value = 0.01842
由于P值小于显著性水平0.05,可以得出结论,处理组之间存在显著差异。