R 编程中的比较方法
在数据分析中有很多情况,您需要比较两个总体或样本的均值,您应该使用哪种技术取决于您拥有的数据类型以及这些数据如何组合在一起。均值检验的比较有助于确定您的组是否具有相似的均值。因此,本文包含用于比较R 编程中的平均值的统计测试。这些测试包括:
- T检验
- 威尔科克森试验
- 方差分析测试
- Kruskal-Wallis 检验
R 编程中的比较方法
因此,正如我们在使用各种技术之前所讨论的,这取决于我们拥有的数据类型以及数据如何组合在一起。因此,让我们根据不同类型的数据来一一讨论技术。
比较单样本数据的均值
主要有两种技术用于将单样本均值与标准已知均值进行比较。这两种技术是:
- 一个样本 T 检验
- 单样本 Wilcoxon 检验
一个样本 T 检验
单样本 T 检验用于检验样本均值与总体中均值的已知或假设/假设值之间的统计差异。
R中的实现:
要在 R 中执行单样本 t 检验,请使用函数t.test()。该函数的语法如下所示:
Syntax: t.test(x, mu = 0)
Parameters:
- x: the name of the variable of interest
- mu: set equal to the mean specified by the null hypothesis
例子:
R
# 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)
R
# 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)
R
# 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)
R
# 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)
R
# 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))
R
# 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))
R
# 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)
R
# Taking two dependent variable
sepal = iris$Sepal.Length
petal = iris$Petal.Length
# MANOVA test
result = manova(cbind(Sepal.Length, Petal.Length) ~ Species,
data = iris)
summary(result)
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))
R
# 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)
输出:
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() ,可以按如下方式使用:
Syntax: wilcox.test(x, mu = 0, alternative = “two.sided”)
Parameters:
- x: a numeric vector containing your data values
- mu: the theoretical mean/median value. Default is 0 but you can change it.
- alternative: the alternative hypothesis. Allowed value is one of “two.sided” (default), “greater” or “less”.
示例:在这里,让我们使用一个包含 10 只兔子体重的示例数据集。让我们知道兔子的体重中位数是否不同于25g?
R
# 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,小于显着性水平 alpha = 0.05。因此我们可以拒绝原假设并得出结论,兔子的平均体重与 25g 显着不同,p 值 = 0.005793。
比较配对样本的均值
主要有两种技术用于比较配对样本的均值。这两种技术是:
- 配对样本 T 检验
- 配对样本 Wilcoxon 检验
配对样本 T 检验
这是一个统计程序,用于确定两组观测值之间的平均差是否为零。在配对样本 t 检验中,每个受试者被测量两次,从而产生成对的观察结果。
R中的实现:
要在 R 中执行单样本 t 检验,请使用函数t.test()。该函数的语法如下所示。
Syntax: t.test(x, y, paired =TRUE)
Parameters:
- x, y: numeric vectors
- paired: a logical value specifying that we want to compute a paired t-test
例子:
R
# 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() ,可以按如下方式使用:
Syntax: wilcox.test(x, y, paired = TRUE, alternative = “two.sided”)
Parameters:
- x, y: numeric vectors
- paired: a logical value specifying that we want to compute a paired Wilcoxon test
- alternative: the alternative hypothesis. Allowed value is one of “two.sided” (default), “greater” or “less”.
示例:在这里,我们使用一个示例数据集,其中包含 10 只兔子在治疗前后的体重。我们想知道,治疗前后体重中位数是否有显着差异?
R
# 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,小于显着性水平 alpha = 0.05。我们可以得出结论,治疗前小鼠的中位体重与治疗后的中位体重显着不同,p 值 = 0.001953。
比较两个以上组的平均值
主要有两种技术用于将单样本均值与标准已知均值进行比较。这两种技术是:
- 方差分析 (ANOVA)
- 单向方差分析
- 双向方差分析
- MANOVA 测试
- 克鲁斯卡尔-沃利斯检验
单向方差分析
单因素方差分析 (ANOVA),也称为单因素 ANOVA,是独立双样本 t 检验的扩展,用于在多于两组的情况下比较均值。在单向方差分析中,数据基于一个分组变量被组织成几组。
R中的实现:
要在 R 中执行单向方差分析 (ANOVA),请使用函数aov()。函数summary.aov()用于总结方差模型的分析。该函数的语法如下所示。
Syntax: aov(formula, data = NULL)
Parameters:
- formula: A formula specifying the model.
- data: A data frame in which the variables specified in the formula will be found
例子:
一种方法是使用 mtcars 数据集执行 ANOVA 测试,该数据集在 disp 属性(连续属性)和 gear 属性(分类属性)之间预装了 dplyr 包。
R
# 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,证明齿轮对位移有显着影响,即相互关联,我们拒绝零假设。
双向方差分析
双向 ANOVA 检验用于同时评估两个分组变量(A 和 B)对响应变量的影响。它考虑了两个类别组。
R中的实现:
要在 R 中执行双向方差分析 (ANOVA),还可以使用函数aov()。函数summary.aov() 用于总结方差分析模型。该函数的语法如下所示。
Syntax: aov(formula, data = NULL)
Parameters:
- formula: A formula specifying the model.
- data: A data frame in which the variables specified in the formula will be found
示例:使用 mtcars 数据集执行双向 ANOVA 测试,该数据集在 disp 属性、连续属性和齿轮属性、分类属性、am 属性、分类属性之间预装了 dplyr 包。
R
# 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(mtcars$gear) 2 280221 140110 20.695 3.03e-06 ***
factor(mtcars$am) 1 6399 6399 0.945 0.339
Residuals 28 189565 6770
—
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
总结表明,gear 属性对位移非常重要(三颗星表示),am 属性对位移没有太大意义。齿轮的P值小于0.05,证明齿轮对位移有显着影响,即相互关联。 am 的 P 值大于 0.05,am 对位移不显着,即互不相关。
MANOVA 测试
多元方差分析 (MANOVA)只是具有多个因变量的 ANOVA(方差分析)。它是 ANOVA 的延续。在 ANOVA 中,我们通过独立分组变量测试一个连续因变量的统计差异。 MANOVA 通过采用多个连续因变量并将它们共同捆绑成一个加权线性复合变量来继续此分析。 MANOVA 比较新创建的组合是否因自变量的不同水平或组而变化。
R中的实现:
R 提供了一种方法manova()来执行 MANOVA 测试。 “manova”类与“aov”类的不同之处在于选择不同的汇总方法。函数manova() 调用 aov,然后将类“manova”添加到每个层的结果对象中。
Syntax: manova(formula, data = NULL, projections = FALSE, qr = TRUE, contrasts = NULL, …)
Parameters:
- formula: A formula specifying the model.
- data: A data frame in which the variables specified in the formula will be found. If missing, the variables are searched for in the standard way.
- projections: Logical flag
- qr: Logical flag
- contrasts: A list of contrasts to be used for some of the factors in the formula.
…: Arguments to be passed to lm, such as subset or na.action
示例:要在 R 中执行 MANOVA 测试,让我们采用 iris 数据集。
R
# 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()可以按如下方式使用。
R
# Taking two dependent variable
sepal = iris$Sepal.Length
petal = iris$Petal.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
从上面的输出可以看出,这两个变量在 Species 之间存在高度显着差异。
Kruskal-Wallis 检验
Kruskal-Wallis 检验是一种基于等级的检验,类似于 Mann-Whitney U 检验,但可以应用于具有两个以上组的单向数据。它是单向 ANOVA 检验的非参数替代方案,它扩展了双样本 Wilcoxon 检验。如果一组数据样本来自不相关的人群并且样本之间不相互影响,则它们是独立的。使用 Kruskal-Wallis 检验,可以确定总体分布是否相似,而不假设它们遵循正态分布。
R中的实现:
R 提供了一个方法kruskal.test()可以在 stats 包中执行 Kruskal-Wallis 秩和检验。
Syntax: kruskal.test(x, g, formula, data, subset, na.action, …)
Parameters:
- x: a numeric vector of data values, or a list of numeric data vectors.
- g: a vector or factor object giving the group for the corresponding elements of x
- formula: a formula of the form response ~ group where response gives the data values and group a vector or factor of the corresponding groups.
- data: an optional matrix or data frame containing the variables in the formula formula.
- subset: an optional vector specifying a subset of observations to be used.
- na.action: a function which indicates what should happen when the data contain NA
- …: further arguments to be passed to or from methods.
示例:让我们使用名为 PlantGrowth 的内置 R 数据集。它包含在对照和两种不同处理条件下获得的植物重量。
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”、“trt1”、“trt2”)称为因子级别。级别按字母顺序排列。问题陈述是我们想知道在 3 个实验条件下植物的平均重量之间是否存在显着差异。并且可以使用下面给出的函数kruskal.test() 来执行测试。
R
# 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,因此可以得出结论,治疗组之间存在显着差异。