从0开始学习R语言--Day35--核密度动态估计
对于在时空上分布的数据,通常都需要我们去观察其变化规律。但仅仅只用直方图只能看到分布,对于变化的趋势并没有把握得那么细节,这个时候我们会采取用核密度动态估计的方法。
也许很多人对此有疑惑,明明直方图也能看出数据的变化趋势,核密度的图像只是看起来更平滑,把棱角磨掉了而已。但其实,两者有个本质的区别在于,假如直方图对于区间设置的过大或过小,数据的趋势会因此改变,且有可能存在把峰值靠在一起从而忽略掉其中一个的情况,而核密度则会自动平滑掉噪声干扰且会自动选择最佳的区间以尽可能显示数据的所有特点。
以下是一个例子:
# 生成模拟数据集 - 混合正态分布
set.seed(123) # 设置随机种子保证结果可重复
data <- c(rnorm(200, mean = 0, sd = 1), rnorm(300, mean = 5, sd = 1.5))# 查看原始数据的直方图
hist(data, breaks = 30, col = "lightblue", main = "Histogram of Generated Data",xlab = "Value", prob = TRUE)# 基本核密度估计
density_est <- density(data)
plot(density_est, main = "Basic Kernel Density Estimate",xlab = "Value", ylab = "Density")
polygon(density_est, col = "lightgreen", border = "black")# 尝试不同带宽
par(mfrow = c(2, 2)) # 设置2x2的图形布局# 默认带宽
plot(density(data), main = "Default Bandwidth", col = "blue")# 较小带宽
plot(density(data, bw = 0.2), main = "Small Bandwidth (0.2)", col = "red")# 较大带宽
plot(density(data, bw = 1.5), main = "Large Bandwidth (1.5)", col = "darkgreen")# 使用不同核函数
plot(density(data, kernel = "rectangular"), main = 'Rectangular Kernel', col = "purple")# 恢复单图布局
par(mfrow = c(1, 1))# 比较两组数据的密度
data_group1 <- rnorm(300, mean = 0, sd = 1)
data_group2 <- rnorm(300, mean = 2, sd = 1.2)plot(density(data_group1), col = "blue", main = "Comparing Two Distributions",xlim = range(c(data_group1, data_group2)))
lines(density(data_group2), col = "red")
legend("topright", legend = c("Group 1", "Group 2"), col = c("blue", "red"), lty = 1)
输出:
从结果可以看到,假如在手动设置区间时不小心设为了[0,1],那么有可能会忽略掉另一个峰;而不同的核密度估计图,设置的带宽如果比较小,那么会看到很多数据的细节,但容易造成过拟合,过大则容易忽略掉一些转折,一般都采用默认值不去调。