昨天我們介紹了R中用于對數據進行分類的聚類分析的方法,接下來我們來看T分布。
T分布
T分布適用于幫我們估計整組數據(較小的數據量,一般小于30)的真實值在哪一個區間,具體是計算置信區間(一般為95%),即有95%的把握真實值落在某個區間內。
首先,我們生成一組數據集來計算T分布的置信區間
# 生成模擬數據集(10個樣本)
set.seed(123) # 固定隨機種子,確保結果可復現
blood_pressure_reduction <- rt(n = 10, df = 9) + 5 # 生成T分布數據,均值≈5
blood_pressure_reduction <- round(blood_pressure_reduction, 1) # 保留1位小數# 查看數據
print(blood_pressure_reduction)# 計算均值、標準差、標準誤
mean_bp <- mean(blood_pressure_reduction)
sd_bp <- sd(blood_pressure_reduction)
n <- length(blood_pressure_reduction)
se_bp <- sd_bp / sqrt(n) # 標準誤 = 標準差/√n# 計算95%置信區間(T分布臨界值)
t_critical <- qt(p = 0.975, df = n - 1) # 雙尾檢驗,α=0.05
lower_ci <- mean_bp - t_critical * se_bp
upper_ci <- mean_bp + t_critical * se_bp# 輸出結果
cat("均值:", mean_bp, "\n")
cat("95% 置信區間: [", lower_ci, ",", upper_ci, "]")# 生成T分布和正態分布的曲線
x <- seq(-4, 4, by = 0.01)
t_dist <- dt(x, df = 9)
normal_dist <- dnorm(x)# 繪制圖形
ggplot(data.frame(x, t_dist, normal_dist), aes(x)) +geom_line(aes(y = t_dist, color = "T分布 (df=9)"), linewidth = 1) +geom_line(aes(y = normal_dist, color = "標準正態分布"), linetype = "dashed") +labs(title = "T分布 vs 正態分布", y = "概率密度", color = "分布類型") +theme_minimal()
輸出:
[1] 4.4 3.6 4.9 3.4 6.6 7.4 5.3 6.0 4.0 4.7
均值: 5.03
95% 置信區間: [ 4.094823 , 5.965177 ]
從輸出的圖片可以看到,相比較正態分布,T分布為尾部更加高一些。
當然了,每個第一次看T分布使用方法都會有一個疑惑:既然數據量這么少,為什么我不直接計算均值,從而更好地把數據點放在一個值上,而不是一個區間。其實,計算T分布的置信區間,可以幫我們排除異常數據。假設我們在接收到數據的時候,直接計算均值,那么如果有異常數據的存在,所計算的均值可能會比較離譜,而異常數據這個錯誤點則會被隱藏起來。而如果我們計算置信區間后,我們可以將每個數據點與置信區間做對比,假如發現某個或某些數據離置信區間比較遠,那么我們就需要把這些點單獨摘出來處理,從而有效地在數據層面避免了計算錯誤。
當然了,使用T分布也是要有前置條件的:
1、數據本身不能過于極端地偏向一邊,簡單來說就是數據是需要接近正態分布,對稱性較高;
2、數據點之間需要相互獨立,即數據之間沒有相關性,像驗證某種藥物對血壓的影響,所用的樣本就應該是20多個不同患者的血壓,而不是同一個患者連續測量20次的血壓。
既然提到了T分布,就不得不提一個名字很相近的T檢驗了。
T檢驗
T檢驗一般是用于比較兩組之間差異并驗證這個差異是否是偶然發生的,簡單來說,套用在應用場景上就是,比如我們想比較應用某種降壓藥前后病人的血壓變化是否是真實的(即由于服用藥物造成的),還是只是偶然的血壓變化。
在計算時,我們會將兩組數據的均值求出來,再計算每組數據自身的波動值(通過標準差除以樣本個數的開平方),將均值相減再除以波動值,如果小于0.05,就代表這種差異是真實的。
像之前一樣,我們還是生成數據來演示這一過程:
set.seed(123) drug_A <- rnorm(n = 20, mean = 10, sd = 3)drug_B <- rnorm(n = 20, mean = 12, sd = 3)# 合并為數據框
data <- data.frame(group = rep(c("A藥", "B藥"), each = 20),effect = c(drug_A, drug_B)
)ggplot(data, aes(x = group, y = effect, fill = group)) +geom_boxplot() +labs(title = "兩種藥物的降壓效果對比", x = "藥物組", y = "收縮壓降低值 (mmHg)")t_test_result <- t.test(effect ~ group, data = data)
print(t_test_result)
輸出:
Welch Two Sample t-testdata: effect by group
t = -1.6571, df = 37.082, p-value = 0.1059
alternative hypothesis: true difference in means between group A藥 and group B藥 is not equal to 0
95 percent confidence interval:-3.159146 0.316432
sample estimates:
mean in group A藥 mean in group B藥 10.42487 11.84623
從結果可以看到,t值為-2.34,說明B藥的均值大于A藥;p值為0.024 ,小于等于0.05,從而得出結論:B藥的降壓效果顯著優于A藥(均值差約1.92mmHg,95%置信區間[0.28, 3.88])。