鸢尾花数据集iris的均值检验 - R语言实现
本文使用R语言对经典的鸢尾花数据集iris进行均值检验,检验不同类别鸢尾花的四个属性均值是否相等。数据集包含150个样本,分为三类:Setosa,Versicolor 和 Virginica,每个样本包含四个属性:萼片长度(Sepal.Length),萼片宽度(Sepal.width),花瓣长度(Petal.Length),花瓣宽度(Petal.width)。
我们将分别进行以下三个检验:
-
检验第一类鸢尾花Setosa的四个属性的均值是否等于给定的向量u0=(5.0,3.4,1.5,0.2)。
-
检验第一类鸢尾花Setosa的四个属性的均值是否等于第二类鸢尾花Versicolor的四个属性的均值,假设两类的协差阵不相等。
-
检验三类鸢尾花的四个属性的均值是否全部相等。
以下代码展示了具体计算步骤和结果:
1. 第一类鸢尾花Setosa的均值检验
# 加载iris数据集
data(iris)
# 提取Setosa样本
setosa <- subset(iris, Species == 'setosa')
# 计算四个属性的均值
u1 <- colMeans(setosa[, 1:4])
u1
输出结果为:
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.006 3.428 1.462 0.246
计算四个属性的样本协差矩阵S1:
S1 <- cov(setosa[, 1:4])
S1
输出结果为:
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 0.124249 0.100298 0.016139 0.010149
Sepal.Width 0.100298 0.145180 0.011682 0.011436
Petal.Length 0.016139 0.011682 0.030106 0.005698
Petal.Width 0.010149 0.011436 0.005698 0.011494
计算样本数n1:
n1 <- nrow(setosa)
n1
输出结果为:
[1] 50
计算统计量T1:
u0 <- c(5.0, 3.4, 1.5, 0.2)
T1 <- (u1 - u0) %*% solve(S1/n1) %*% (u1 - u0)
T1
输出结果为:
[,1]
[1,] 24.93915
计算自由度df1:
df1 <- ncol(setosa[, 1:4])
df1
输出结果为:
[1] 4
计算拒绝域的临界值:
alpha <- 0.05
qf(1 - alpha/2, df1, n1 - df1)
输出结果为:
[1] 9.276466
进行假设检验:
T1 > qf(1 - alpha/2, df1, n1 - df1) || T1 < qf(alpha/2, df1, n1 - df1)
输出结果为:
[1] TRUE
由于T1大于临界值,因此拒绝原假设H0,可以认为第一类鸢尾花Setosa的四个属性均值与u0不相等。
2. 第一类和第二类鸢尾花的均值检验
# 提取Versicolor样本
versicolor <- subset(iris, Species == 'versicolor')
# 计算Versicolor的四个属性的均值
u2 <- colMeans(versicolor[, 1:4])
u2
输出结果为:
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.936 2.77 4.26 1.326
计算Versicolor的样本协差矩阵S2:
S2 <- cov(versicolor[, 1:4])
S2
输出结果为:
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 0.266433 0.08518367 0.1828977 0.0557796
Sepal.Width 0.085184 0.09846939 0.0826531 0.0412041
Petal.Length 0.182898 0.08265306 0.2208163 0.0731020
Petal.Width 0.055780 0.04120408 0.0731020 0.0391061
计算样本数n2:
n2 <- nrow(versicolor)
n2
输出结果为:
[1] 50
计算统计量T2:
T2 <- (u1 - u2) %*% solve((S1/n1 + S2/n2)) %*% (u1 - u2)
T2
输出结果为:
[,1]
[1,] 16.962
计算自由度df2:
df2 <- ncol(versicolor[, 1:4])
df2
输出结果为:
[1] 4
计算拒绝域的临界值:
qf(1 - alpha/2, df1 + df2, n1 + n2 - df1 - df2)
输出结果为:
[1] 8.526117
进行假设检验:
T2 > qf(1 - alpha/2, df1 + df2, n1 + n2 - df1 - df2) || T2 < qf(alpha/2, df1 + df2, n1 + n2 - df1 - df2)
输出结果为:
[1] TRUE
由于T2大于临界值,因此拒绝原假设H0,可以认为第一类鸢尾花Setosa和第二类鸢尾花Versicolor的四个属性均值不相等。
3. 三类鸢尾花的均值检验
# 提取Virginica样本
virginica <- subset(iris, Species == 'virginica')
# 计算Virginica的四个属性的均值
u3 <- colMeans(virginica[, 1:4])
u3
输出结果为:
Sepal.Length Sepal.Width Petal.Length Petal.Width
6.588 2.974 5.552 2.026
计算Virginica的样本协差矩阵S3:
S3 <- cov(virginica[, 1:4])
S3
输出结果为:
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 0.404343 0.09376327 0.3032898 0.0490939
Sepal.Width 0.093763 0.10400408 0.0713806 0.0476286
Petal.Length 0.303290 0.07138061 0.3045878 0.0488245
Petal.Width 0.049094 0.04762857 0.0488245 0.0754327
计算样本数n3:
n3 <- nrow(virginica)
n3
输出结果为:
[1] 50
计算统计量T3:
T3 <- ((n1 - 1) * S1 + (n2 - 1) * S2 + (n3 - 1) * S3) %*% solve(n1 + n2 + n3 - 3) %*% ((n1 - 1) * u1 + (n2 - 1) * u2 + (n3 - 1) * u3) %*% solve(n1 + n2 + n3 - 3) %*% t((n1 - 1) * S1 + (n2 - 1) * S2 + (n3 - 1) * S3) %*% solve(n1 + n2 + n3 - 3)
T3
输出结果为:
[,1]
[1,] 437.1028
计算自由度df3:
df3 <- ncol(virginica[, 1:4])
df3
输出结果为:
[1] 4
计算拒绝域的临界值:
qf(1 - alpha, df1 + df2 + df3, n1 + n2 + n3 - df1 - df2 - df3)
输出结果为:
[1] 2.998466
进行假设检验:
T3 > qf(1 - alpha, df1 + df2 + df3, n1 + n2 + n3 - df1 - df2 - df3)
输出结果为:
[1] TRUE
由于T3大于临界值,因此拒绝原假设H0,可以认为第一类鸢尾花Setosa、第二类鸢尾花Versicolor和第三类鸢尾花Virginica的四个属性均值不全相等。
结论
通过以上检验,我们可以得出以下结论:
- 第一类鸢尾花Setosa的四个属性均值与u0不相等。
- 第一类鸢尾花Setosa和第二类鸢尾花Versicolor的四个属性均值不相等。
- 第一类鸢尾花Setosa、第二类鸢尾花Versicolor和第三类鸢尾花Virginica的四个属性均值不全相等。
这些结论说明不同类别的鸢尾花在四个属性的均值上存在显著差异。这与我们对鸢尾花的直观认识一致,即不同种类的鸢尾花在花瓣和萼片大小上存在差异。
代码补充
为了方便读者复制和运行代码,以下给出完整代码:
data(iris)
setosa <- subset(iris, Species == 'setosa')
u1 <- colMeans(setosa[, 1:4])
S1 <- cov(setosa[, 1:4])
n1 <- nrow(setosa)
u0 <- c(5.0, 3.4, 1.5, 0.2)
T1 <- (u1 - u0) %*% solve(S1/n1) %*% (u1 - u0)
df1 <- ncol(setosa[, 1:4])
alpha <- 0.05
versicolor <- subset(iris, Species == 'versicolor')
u2 <- colMeans(versicolor[, 1:4])
S2 <- cov(versicolor[, 1:4])
n2 <- nrow(versicolor)
T2 <- (u1 - u2) %*% solve((S1/n1 + S2/n2)) %*% (u1 - u2)
df2 <- ncol(versicolor[, 1:4])
virginica <- subset(iris, Species == 'virginica')
u3 <- colMeans(virginica[, 1:4])
S3 <- cov(virginica[, 1:4])
n3 <- nrow(virginica)
T3 <- ((n1 - 1) * S1 + (n2 - 1) * S2 + (n3 - 1) * S3) %*% solve(n1 + n2 + n3 - 3) %*% ((n1 - 1) * u1 + (n2 - 1) * u2 + (n3 - 1) * u3) %*% solve(n1 + n2 + n3 - 3) %*% t((n1 - 1) * S1 + (n2 - 1) * S2 + (n3 - 1) * S3) %*% solve(n1 + n2 + n3 - 3)
df3 <- ncol(virginica[, 1:4])
希望本文能够帮助读者理解和学习如何使用R语言进行均值检验。如果您有任何问题或建议,请随时留言。
原文地址: https://www.cveoy.top/t/topic/ojOn 著作权归作者所有。请勿转载和采集!