Rによるスチューデント化された範囲の統計量

Rを利用して スチューデント化された範囲の統計量 を求めます。

始めにサンプルデータを作成します。

seed <- 20250520
set.seed(seed)

# グループ数
k <- 3

# 各グループのサンプルサイズ
n_per_group <- 5

# 各グループのデータを生成
# グループ1: 平均 約20, 標準偏差 約3
group1_data <- rnorm(n_per_group, mean = 20, sd = 3)
# グループ2: 平均 約25, 標準偏差 約3
group2_data <- rnorm(n_per_group, mean = 25, sd = 3)
# グループ3: 平均 約22, 標準偏差 約3
group3_data <- rnorm(n_per_group, mean = 22, sd = 3)

# 全データをリストにまとめる
all_data_list <- list(
  group1 = group1_data,
  group2 = group2_data,
  group3 = group3_data
)

# 全データ数を計算
N_total <- k * n_per_group

# 生成されたデータを表示
print("--- 生成されたサンプルデータ ---")
print(all_data_list)
[1] "--- 生成されたサンプルデータ ---"
$group1
[1] 27.82400 18.48560 19.35952 19.91222 15.31239

$group2
[1] 28.37961 31.20826 25.99102 22.84083 27.34637

$group3
[1] 21.74628 17.70076 25.44748 23.75106 21.20979

続いて各グループの平均値を求めます。

group_means <- numeric(k)
for (i in 1:k) {
  group_means[i] <- mean(all_data_list[[i]])
}
names(group_means) <- paste0("group", 1:k)

print("--- 各グループの平均値 ---")
print(group_means)
[1] "--- 各グループの平均値 ---"
  group1   group2   group3 
20.17874 27.15322 21.97107 

分散分析における誤差の平均平方 (Mean Squared Error, MSE) を求めます(以降「プールされた分散」)。

# MSE = SSE / DFE
# SSE (Sum of Squares for Error) = sum_i sum_j (x_ij - mean(x_i))^2
# DFE (Degrees of Freedom for Error) = N_total - k

# 各グループの偏差平方和 (Sum of Squares Within) を計算
ss_within_groups <- numeric(k)
for (i in 1:k) {
  group_data <- all_data_list[[i]]
  mean_g <- mean(group_data)
  ss_within_groups[i] <- sum((group_data - mean_g)^2)
}

# 全体の誤差平方和 (SSE)
SSE <- sum(ss_within_groups)

# 誤差の自由度 (DFE)
DFE <- N_total - k

# プールされた分散 (MSE)
pooled_variance_MSE <- SSE / DFE

print("--- プールされた分散 (MSE) ---")
print(paste("SSE (誤差平方和):", round(SSE, 4)))
print(paste("DFE (誤差の自由度):", DFE))
print(paste("プールされた分散 (MSE):", round(pooled_variance_MSE, 4)))
[1] "--- プールされた分散 (MSE) ---"
[1] "SSE (誤差平方和): 157.7918"
[1] "DFE (誤差の自由度): 12"
[1] "プールされた分散 (MSE): 13.1493"

標準誤差 (Standard Error, SE) を求めます。

# SE = sqrt(MSE / n_per_group)  ※各グループのサンプルサイズが等しい場合
standard_error_SE <- sqrt(pooled_variance_MSE / n_per_group)

print("--- 標準誤差 (SE) ---")
print(paste("標準誤差 (SE):", round(standard_error_SE, 4)))
[1] "--- 標準誤差 (SE) ---"
[1] "標準誤差 (SE): 1.6217"

標本平均の最大値と最小値の差(範囲)を求めます。

max_mean <- max(group_means)
min_mean <- min(group_means)
range_of_means <- max_mean - min_mean

print("--- 標本平均の範囲 ---")
print(paste("最大平均値:", round(max_mean, 4)))
print(paste("最小平均値:", round(min_mean, 4)))
print(paste("平均値の範囲:", round(range_of_means, 4)))
[1] "--- 標本平均の範囲 ---"
[1] "最大平均値: 27.1532"
[1] "最小平均値: 20.1787"
[1] "平均値の範囲: 6.9745"

最後にスチューデント化された範囲の統計量 q を求めます。

q_statistic <- range_of_means / standard_error_SE

print("--- スチューデント化された範囲の統計量 q ---")
print(paste("q統計量:", round(q_statistic, 4)))
[1] "--- スチューデント化された範囲の統計量 q ---"
[1] "q統計量: 4.3008"

以上です。