我们进行研究的时候经常会遇见偏态数据,数据转换是统计分析和数据预处理中的一项基本技术。使用 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/