对例题3.2.1人的出汗多少与人体内钠和钾的含量进行分析 X1表示成年女性的出汗量 X2为钠的含量 X3为钾的含量 接下来检验\(H0:\mu=\mu_0=(4,50,10)'\),\(H1:\mu \neq \mu_0=(4,50,10)'\) 首先导入数据
data <- data.frame(
X1 = c(3.7, 4.7, 3.8, 3.2, 3.1, 4.6, 2.4, 7.2, 6.7, 5.4,
3.9, 4.5, 3.5, 4.5, 1.5, 8.5, 4.5, 6.5, 4.1, 5.5),
X2 = c(48.5, 65.1, 47.2, 53.2, 55.5, 36.1, 24.8, 33.1, 47.4, 54.1,
36.9, 58.8, 27.8, 40.2, 13.5, 56.4, 71.6, 52.8, 44.1, 40.9),
X3 = c(9.3, 8.0, 10.9, 12.0, 9.7, 7.9, 14.0, 7.6, 8.5, 11.3,
12.7, 12.3, 9.8, 8.4, 10.1, 7.1, 8.2, 10.9, 11.2, 9.4)
)
data#(和课本上有一点不一样,不改了)
## X1 X2 X3
## 1 3.7 48.5 9.3
## 2 4.7 65.1 8.0
## 3 3.8 47.2 10.9
## 4 3.2 53.2 12.0
## 5 3.1 55.5 9.7
## 6 4.6 36.1 7.9
## 7 2.4 24.8 14.0
## 8 7.2 33.1 7.6
## 9 6.7 47.4 8.5
## 10 5.4 54.1 11.3
## 11 3.9 36.9 12.7
## 12 4.5 58.8 12.3
## 13 3.5 27.8 9.8
## 14 4.5 40.2 8.4
## 15 1.5 13.5 10.1
## 16 8.5 56.4 7.1
## 17 4.5 71.6 8.2
## 18 6.5 52.8 10.9
## 19 4.1 44.1 11.2
## 20 5.5 40.9 9.4
记随机向量\(X=(X1,X2,X3)'\),假定\(X \sim N_3(\mu,\Sigma)\) 取检验统计量为\(F = \frac{n - p}{(n - 1)p} T^2 \quad (p = 3, n = 20)\)
Xmeans <-colMeans(data)
Xmeans
## X1 X2 X3
## 4.590 45.400 9.965
n <-nrow(data)
p <-ncol(data)
print(n)
## [1] 20
A<- (n-1)*cov(data) # 样本离差阵 = (n-1) * 协方差矩阵
A
## X1 X2 X3
## X1 53.538 170.49 -32.4070
## X2 170.490 3795.98 -107.1600
## X3 -32.407 -107.16 68.9255
#计算样本离差阵的逆
A_inv <-solve(A)
A_inv
## X1 X2 X3
## X1 0.0291320829 -9.640614e-04 1.219831e-02
## X2 -0.0009640614 3.074329e-04 2.469584e-05
## X3 0.0121983096 2.469584e-05 2.028215e-02
#计算hotellling统计量
u0 <-c(4,50,10)
D2 <- (n-1)*t(Xmeans-u0)%*%A_inv%*%(Xmeans-u0)
T2 <- n*D2
D2
## [,1]
## [1,] 0.4067537
T2
## [,1]
## [1,] 8.135075
得到上式D2和T2的值分别为0.4067537和8.135075,进一步地可以计算出F的值
F_stat <- (n-p)/((n-1)*p)*T2
F_stat
## [,1]
## [1,] 2.42625
得到F的值为2.42625之后,进一步对其进行假设检验,首先计算p值,在该情况下可知\(F \sim F(3,17)\)
#计算p值
p_value <-pf(F_stat,p,n-p,lower.tail = FALSE)
p_value
## [,1]
## [1,] 0.1010612
得到p值为\(0.1010612>0.05=\alpha\),故接受H0
alpha <-0.05
F_cirt <-qf(1-alpha,p,n-p)
F_cirt
## [1] 3.196777
也可以用F分布的临界值表进行判断,得到\(F_{3,17}(0.05)=3.196777>F=2.42625\),所以接受H0.
最后对接受H0进行解释:认为意味着测量的这组数据在统计上没有显著偏离假设的均值,即这些女性的出汗量和体内钠、钾的含量与假设的值没有显著差异。可以认为人的出汗的多少与人体钾和钠的含量有一定的关系。
例题3.3.2 为了研究某种疾病,对一批人同时测量了 4 个指标:\(\beta\) 脂蛋白 (\(X_1\)),甘油三酯 (\(X_2\)),\(\alpha\) 脂蛋白 (\(X_3\)),前 \(\beta\) 脂蛋白 (\(X_4\))。按不同年龄、不同性别分为三组(20 至 35 岁的女性、20 至 25 岁的男性和 35 至 50 岁的男性),数据见表 3.3。试问这三个组的 4 项指标间有无显著性差异 (\(\alpha = 0.01\))? 首先导入数据
# 创建数据框
body_data <- data.frame(
X1 = c(260, 200, 240, 170, 270, 205, 190, 200, 250, 200,
225, 210, 170, 270, 190, 280, 310, 270, 250, 260,
310, 310, 190, 225, 170, 210, 280, 210, 280, 200,
200, 280, 190, 295, 270, 280, 240, 280, 370, 280,
320, 260, 360, 295, 270, 380, 240, 260, 260, 295,
240, 310, 330, 345, 250, 260, 225, 345, 360, 250),
X2 = c(75, 72, 87, 65, 110, 130, 69, 46, 117, 107,
130, 125, 64, 76, 60, 81, 119, 57, 67, 135,
122, 60, 40, 65, 65, 82, 67, 38, 65, 76,
76, 94, 60, 55, 125, 120, 62, 69, 70, 40,
64, 59, 88, 100, 65, 114, 55, 55, 110, 73,
114, 103, 112, 127, 62, 59, 100, 120, 107, 117),
X3 = c(40, 34, 45, 39, 39, 34, 27, 45, 21, 28,
36, 26, 31, 33, 34, 20, 25, 31, 31, 39,
30, 35, 27, 34, 37, 31, 37, 36, 30, 40,
39, 26, 33, 30, 24, 32, 32, 29, 30, 37,
39, 37, 28, 36, 32, 36, 42, 34, 29, 33,
38, 32, 21, 24, 22, 21, 34, 36, 25, 36),
X4 = c(18, 17, 18, 17, 24, 23, 15, 15, 20, 20,
11, 17, 14, 13, 16, 18, 15, 8, 14, 29,
21, 18, 15, 16, 16, 17, 18, 17, 23, 17,
20, 11, 17, 16, 21, 18, 20, 20, 20, 17,
17, 11, 26, 12, 21, 21, 10, 20, 20, 21,
18, 18, 11, 20, 16, 19, 30, 18, 23, 16),
Group = c(rep(1, 20), rep(2, 20), rep(3, 20))
)
# 查看数据结构
str(body_data)
## 'data.frame': 60 obs. of 5 variables:
## $ X1 : num 260 200 240 170 270 205 190 200 250 200 ...
## $ X2 : num 75 72 87 65 110 130 69 46 117 107 ...
## $ X3 : num 40 34 45 39 39 34 27 45 21 28 ...
## $ X4 : num 18 17 18 17 24 23 15 15 20 20 ...
## $ Group: num 1 1 1 1 1 1 1 1 1 1 ...
# 查看前几行数据
head(body_data)
## X1 X2 X3 X4 Group
## 1 260 75 40 18 1
## 2 200 72 34 17 1
## 3 240 87 45 18 1
## 4 170 65 39 17 1
## 5 270 110 39 24 1
## 6 205 130 34 23 1
# 按组别查看数据
by(body_data, body_data$Group, head)
## body_data$Group: 1
## X1 X2 X3 X4 Group
## 1 260 75 40 18 1
## 2 200 72 34 17 1
## 3 240 87 45 18 1
## 4 170 65 39 17 1
## 5 270 110 39 24 1
## 6 205 130 34 23 1
## ------------------------------------------------------------
## body_data$Group: 2
## X1 X2 X3 X4 Group
## 21 310 122 30 21 2
## 22 310 60 35 18 2
## 23 190 40 27 15 2
## 24 225 65 34 16 2
## 25 170 65 37 16 2
## 26 210 82 31 17 2
## ------------------------------------------------------------
## body_data$Group: 3
## X1 X2 X3 X4 Group
## 41 320 64 39 17 3
## 42 260 59 37 11 3
## 43 360 88 28 26 3
## 44 295 100 36 12 3
## 45 270 65 32 21 3
## 46 380 114 36 21 3
为了比较三个组的四项指标间是否有差异问题,可以转化为对多总体均值向量是否相等的检验问题。设第 \(i\) 组为 4 元总体\((N_4(\mu^{(i)}, \Sigma) (i=1,2,3)\) 来自 3 个总体的样本容量 \(n_1=n_2=n_3=20\)。
检验:\(H_0: \mu^{(1)} = \mu^{(2)} = \mu^{(3)}\)
\(H_1: \mu^{(1)}, \mu^{(2)}, \mu^{(3)}\)至少有一对不等
means <-colMeans(body_data)
means
## X1 X2 X3 X4 Group
## 259.08333 84.11667 32.36667 17.80000 2.00000
接下来计算每一个组的样本均值
means1 <-colMeans(subset(body_data,Group==1))
means2 <-colMeans(subset(body_data,Group==2))
means3 <-colMeans(subset(body_data,Group==3))
means1
## X1 X2 X3 X4 Group
## 231.0 89.6 32.9 17.1 1.0
means2
## X1 X2 X3 X4 Group
## 253.50 72.55 32.45 17.90 2.00
means3
## X1 X2 X3 X4 Group
## 292.75 90.20 31.75 18.40 3.00
# 提取 Group 为 1 的子集
subset_group1 <- subset(body_data, Group == 1)
# 计算样本离差阵(协方差矩阵)
cov_matrix_group1 <- 19*cov(subset_group1[, 1:4]) # 假设 X1, X2, X3, X4 是数值列
# 打印样本离差阵
print(cov_matrix_group1)
## X1 X2 X3 X4
## X1 30530 6298.0 -1078.0 198.0
## X2 6298 15736.8 -796.8 1387.8
## X3 -1078 -796.8 955.8 90.2
## X4 198 1387.8 90.2 413.8
# 提取 Group 为 2的子集
subset_group2 <- subset(body_data, Group == 2)
# 计算样本离差阵(协方差矩阵)
cov_matrix_group2 <- 19*cov(subset_group2[, 1:4]) # 假设 X1, X2, X3, X4 是数值列
# 打印样本离差阵
print(cov_matrix_group2)
## X1 X2 X3 X4
## X1 51705.0 7021.50 -1571.50 827.0
## X2 7021.5 12288.95 -807.95 321.1
## X3 -1571.5 -807.95 364.95 -5.1
## X4 827.0 321.10 -5.10 133.8
# 提取 Group 为 3的子集
subset_group3 <- subset(body_data, Group == 3)
# 计算样本离差阵(协方差矩阵)
cov_matrix_group3 <- 19*cov(subset_group3[, 1:4]) # 假设 X1, X2, X3, X4 是数值列
# 打印样本离差阵
print(cov_matrix_group3)
## X1 X2 X3 X4
## X1 43173.75 9959.0 -1301.25 723.0
## X2 9959.00 12441.2 -333.00 457.4
## X3 -1301.25 -333.0 761.75 -112.0
## X4 723.00 457.4 -112.00 476.8
AA=cov_matrix_group1+cov_matrix_group2+cov_matrix_group3
AA
## X1 X2 X3 X4
## X1 125408.75 23278.50 -3950.75 1748.0
## X2 23278.50 40466.95 -1937.75 2166.3
## X3 -3950.75 -1937.75 2082.50 -26.9
## X4 1748.00 2166.30 -26.90 1024.4
继续计算总离差阵
# 将均值向量扩展为与数据相同维度的矩阵
means_matrix <- matrix(means[1:4],nrow=60,ncol=4,byrow=TRUE)
# 😦这里用as.matrix将数据框转化为矩阵
data_diff <- as.matrix(body_data[, 1:4] - means_matrix)
# 计算总离差阵
T <- t(data_diff) %*% data_diff
T
## X1 X2 X3 X4
## X1 164474.583 25586.417 -4674.833 2534.0
## X2 25586.417 44484.183 -1973.567 2139.4
## X3 -4674.833 -1973.567 2095.933 -41.6
## X4 2534.000 2139.400 -41.600 1041.6
因似然比统计量 \(\Lambda \sim \Lambda(p, n-k, k-1)\),在比例中 \(k-1=2\),可以利用 \(\Lambda\) 统计量与F 统计量的关系,取检验统计量为F统计量: $ F = \(\frac{(n-k)-p+1}{p} \frac{1-\sqrt{\Lambda}}{\sqrt{\Lambda}}\) (k=3, p=4, n=60), $
lambda<- det(AA)/det(T)
lambda
## [1] 0.6621229
f<- (54/4)*(1-sqrt(lambda))/sqrt(lambda)
f
## [1] 3.090691
对于给定的\(\alpha=0.01\),计算p值为
p_value <- 1 - pf(f,8,108)#自由度为8,108
p_value
## [1] 0.003538437
由于\(p=0.003538437<0.01=\alpha\),所以否定H0,表明三个组的指标之前有显著的差异。
进一步为了分析三个组指标间的差异是由哪几项引起的,也可以对四项指标逐项用一元方差分析方法进行检验: 首先对第一项指标X1进行检验,取\(f_1 =\frac{(T_{11} - AA_{11}) / (k - 1)}{AA_{11} / (n - k)}\)
f1=((T[1]-AA[1])/(3-1))/(AA[1]/(60-3))
f1
## [1] 8.877979
再由检验统计量\(F1 \sim F(2,57)\)得到p1值为
p1_value <- 1 - pf(f1,2,57)#自由度为2,57
p1_value
## [1] 0.0004400761
由于P1显著小于0.01,所以可以认为第一项指标X1在三个组之间存在显著差异。同理,也可以对X2,X3进行分析。