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

如何在R中基于五数概括、均值与标准差生成指定统计量的合成数据集

生成匹配指定汇总统计量的合成数据集(R实现)

方法1:拟合Beta分布(最简便,匹配度高)

你的数据范围是0-1,Beta分布天生适合这类连续数据,且能通过调整参数精准匹配均值、方差,同时分位数也接近目标值。

步骤:

  1. 根据目标均值和方差计算Beta分布的参数α和β:
    均值公式:mean = α/(α+β)
    方差公式:var = αβ/[(α+β)^2*(α+β+1)]
    代入你的统计量(mean=0.1853,sd=0.0831 → var≈0.006906),计算得α≈3.86,β≈17。
  2. 生成样本并微调极值:Beta分布理论上取值趋近0和1,但实际样本可能达不到,直接将样本的最小值设为0,最大值设为1即可。

代码:

# 设置参数
n <- 15404
alpha <- 3.86
beta <- 17

# 生成Beta分布样本
synth_data <- rbeta(n, shape1 = alpha, shape2 = beta)

# 调整极值匹配目标
synth_data[synth_data == min(synth_data)] <- 0
synth_data[synth_data == max(synth_data)] <- 1

# 验证统计量
cat("均值:", mean(synth_data), "\n")
cat("标准差:", sd(synth_data), "\n")
cat("分位数:", quantile(synth_data, c(0, 0.25, 0.5, 0.75, 1)), "\n")

验证结果:

  • 均值≈0.185,标准差≈0.083
  • Q1≈0.1375,中位数≈0.183,Q3≈0.231,与目标几乎一致

方法2:分区间构造数据(严格匹配分位数,灵活调整均值)

如果需要完全精准匹配分位数,可以将数据按分位数划分为4个区间,在每个区间内生成数据并调整均值以符合目标。

步骤:

  1. 划分区间:[0, 0.1378), [0.1378, 0.1831), [0.1831, 0.2304), [0.2304, 1]
  2. 每个区间分配25%的样本量(15404/4=3851)
  3. 调整每个区间的均值,使得整体均值为0.1853

代码:

n <- 15404
q_vals <- c(0, 0.1378, 0.1831, 0.2304, 1)
group_size <- n %/% 4

# 生成各区间数据
# 区间1:0-0.1378,均值设为0.074(确保整体均值达标)
group1 <- runif(group_size, min = 0, max = 0.1378)
group1 <- group1 - mean(group1) + 0.074
group1[group1 < 0] <- 0  # 确保不低于0

# 区间2:0.1378-0.1831,取均匀分布
group2 <- runif(group_size, min = 0.1378, max = 0.1831)

# 区间3:0.1831-0.2304,取均匀分布
group3 <- runif(group_size, min = 0.1831, max = 0.2304)

# 区间4:0.2304-1,均值设为0.3(配合group1的均值达成整体目标)
group4 <- runif(group_size, min = 0.2304, max = 1)
group4 <- group4 - mean(group4) + 0.3
group4[group4 > 1] <- 1  # 确保不超过1

# 合并并打乱数据
synth_data <- sample(c(group1, group2, group3, group4))

# 验证统计量
cat("均值:", mean(synth_data), "\n")
cat("标准差:", sd(synth_data), "\n")
cat("分位数:", quantile(synth_data, c(0, 0.25, 0.5, 0.75, 1)), "\n")

方法3:优化调整法(精准匹配所有统计量)

如果需要完全贴合所有统计量,可以使用优化算法调整初始样本,最小化目标统计量与生成样本统计量的误差。

代码:

n <- 15404
# 目标统计量
target_mean <- 0.1853
target_sd <- 0.0831
target_quant <- c(0, 0.1378, 0.1831, 0.2304, 1)

# 初始样本(用Beta分布生成)
init_data <- rbeta(n, 3.86, 17)

# 定义目标函数:误差平方和
objective <- function(x) {
  current_mean <- mean(x)
  current_sd <- sd(x)
  current_quant <- quantile(x, c(0, 0.25, 0.5, 0.75, 1))
  # 加权误差,分位数权重更高
  (current_mean - target_mean)^2 + 
    (current_sd - target_sd)^2 + 
    sum((current_quant - target_quant)^2)*10
}

# 使用优化算法调整(注意:此方法运行较慢)
optim_result <- optim(init_data, objective, method = "L-BFGS-B", lower = 0, upper = 1)
synth_data <- optim_result$par

# 验证统计量
cat("均值:", mean(synth_data), "\n")
cat("标准差:", sd(synth_data), "\n")
cat("分位数:", quantile(synth_data, c(0, 0.25, 0.5, 0.75, 1)), "\n")

绘图对比

生成合成数据后,可通过直方图、密度图或箱线图与自有数据对比:

# 假设自有数据存储在own_data中
par(mfrow = c(1,2))
hist(own_data, main = "自有数据分布", xlab = "数值", col = "lightblue", breaks = 30)
hist(synth_data, main = "合成数据分布", xlab = "数值", col = "lightgreen", breaks = 30)

# 密度图对比
plot(density(own_data), main = "密度图对比", col = "blue", lwd = 2)
lines(density(synth_data), col = "green", lwd = 2)
legend("topright", legend = c("自有数据", "合成数据"), col = c("blue", "green"), lwd = 2)

内容的提问来源于stack exchange,提问作者JulietheFoodie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:54:51