You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:15:03