我們進行研究的時候經常會遇見偏態數據,數據轉換是統計分析和數據預處理中的一項基本技術。使用 R 時,了解如何正確轉換數據有助于滿足統計假設、標準化分布并提高分析的準確性。在 R 中實現和可視化最常見的數據轉換:對數、平方根和立方根轉換。
為什么要轉換數據?
了解數據分布
當您的數據集不滿足統計分析所需的假設時(例如繪制限制立方樣條或者曲線擬合不理想的時候),數據轉換就變得必要。常見方案包括:
高度偏斜的分布
非線性關系
異方差性(不等方差)
非正態分布
下面咱們正式開始:
先生成兩個偏態數據
# 種子
set.seed(123)# 生成兩個偏態數據
right_skewed_data <- rchisq(1000, df=3) # 右傾數據
count_data <- rpois(1000, lambda=5) # 計數數據
hist(count_data,main="Original Count Data",xlab="Value",col="lightblue",breaks=30)
咱們可以看到上面兩個數據都是偏態數據,下面進行數據轉換
數據轉換的類型
1. 對數變換
# 創建一個包含2行和2列的繪圖窗口
par(mfrow=c(2,2))# #原始數據
hist(right_skewed_data, main="Original Right-Skewed Data",xlab="Value",col="lightblue",breaks=30)# 自然日志轉換(加1處理零)
log_data <- log1p(right_skewed_data)
hist(log_data,main="Natural Log Transformed",xlab="log(x+1)",col="lightgreen",breaks=30)# Log10 轉換
log10_data <- log10(right_skewed_data + 1)
hist(log10_data,main="Log10 Transformed",xlab="log10(x+1)",col="lightpink",breaks=30)# QQ日志轉換數據圖
qqnorm(log_data)
qqline(log_data, col="red")
左上圖是原始數據,咱們可以看到轉換后分布明顯不一樣
2. 平方根變換
平方根變換對于計數數據和適度的右偏度特別有效:
par(mfrow=c(2,2))# 原始數據
hist(count_data,main="Original Count Data",xlab="Value",col="lightblue",breaks=30)# 平方根轉換
sqrt_data <- sqrt(count_data)
hist(sqrt_data,main="Square Root Transformed",xlab="sqrt(x)",col="lightgreen",breaks=30)# 比較分布
boxplot(count_data, sqrt_data,names=c("Original", "Square Root"),main="Distribution Comparison")# QQ 圖
qqnorm(sqrt_data)
qqline(sqrt_data, col="red")
左上圖是原始數據,咱們可以看到轉換后分布明顯不一樣,而且箱線圖看出明顯差異。
3. Cube Root 轉換(立方根轉換)
par(mfrow=c(2,2))# 具有負值的原始數據
hist(right_skewed_data,main="Original Data (with negatives)",xlab="Value",col="lightblue",breaks=30)# Cube root 轉換
cbrt_data <- sign(right_skewed_data) * abs(right_skewed_data) ^ (1/3)
hist(cbrt_data,main="Cube Root Transformed",xlab="cbrt(x)",col="lightgreen",breaks=30)# 顯示密度分布
plot(density(right_skewed_data),main="Density Plot Comparison",xlab="Value")
lines(density(cbrt_data), col="red")
legend("topright", legend=c("Original", "Cube Root"),col=c("black", "red"),lty=1)# QQ 圖
qqnorm(cbrt_data)
qqline(cbrt_data, col="red")
最后總結一下,上面三種方法側重點不同,但是經過轉換都能把偏態數據很好的轉成正態分布
參考文獻:https://www.r-bloggers.com/2024/12/how-to-transform-data-in-r-log-square-root-cube-root/