如何在R语言中构建正态分布以近似给定的年龄离散分布
R语言实现分组年龄数据拟合近似正态分布的方法
要实现你的需求,核心思路是先从分组统计数据中计算出原始分布的均值和标准差,这两个参数即可唯一确定对应近似的正态分布,具体操作步骤如下:
步骤1:计算年龄分组的组中值
每个区间的组中值可作为该组所有样本的年龄近似值,计算方式为区间上下限的平均值:
age_bins <- c(10, 20, 30, 40, 50, 60, 70, 80) count <- c(250, 2300, 450, 140, 100, 70, 30) # 计算各组组中值 bin_mid <- (head(age_bins, -1) + tail(age_bins, -1)) / 2 # 输出结果为 15 25 35 45 55 65 75,正好对应每个年龄区间的中点
步骤2:计算原始分布的加权均值和标准差
以各组人数为权重,计算原始分布的均值和标准差:
# 计算加权均值 mu <- weighted.mean(bin_mid, count) # 计算加权标准差 weighted_var <- sum(count * (bin_mid - mu)^2) / (sum(count) - 1) sigma <- sqrt(weighted_var)
运行后得到的均值约为28.6,标准差约为11.4,和你提供的年龄分布特征匹配。
步骤3:生成对应正态分布
如果需要生成符合该正态分布的随机样本,使用rnorm函数即可:
# 生成和原样本总规模一致的正态分布样本,原总样本量为sum(count)=3340 norm_sample <- rnorm(n = sum(count), mean = mu, sd = sigma)
如果需要可视化对比原分布和拟合的正态分布,可使用以下代码:
# 未安装ggplot2先运行 install.packages("ggplot2") library(ggplot2) original_df <- data.frame(age = bin_mid, freq = count / sum(count)) ggplot() + geom_col(data = original_df, aes(x = age, y = freq), fill = "lightblue", alpha = 0.6) + # 正态分布密度曲线,系数调整为和频率尺度匹配 stat_function(fun = function(x) dnorm(x, mean = mu, sd = sigma) * 10, color = "red", linewidth = 1) + labs(x = "年龄", y = "频率", title = "原年龄分布与拟合正态分布对比")
内容的提问来源于stack exchange,提问作者Mikhail
相关产品推荐
相关产品推荐

