从箱线图生成随机值
Generate random values from boxplot
比方说,我有一个现有的箱线图:
median: 5,
q1: 2
q3: 6
5% percentile: 1
95% percentile: 2
我想按照这个分布生成 1,000,000 个随机值。
有办法吗?
我可以生成偏态正态分布,所以另一种方法是将箱线图值转换为偏态分布,但考虑到密度随着 alfa 的变化而变化,我不知道如何着手那。
按照分布生成随机数的最一般方法如下:
- 生成一个以 0 和 1 为界的均匀随机数(例如,
random.random()
)。
- 取该数字的逆 CDF(逆累积分布函数)。
结果是一个服从分布的数字。
在你的情况下,你已经很清楚逆 CDF (ICDF(x)
) 的外观,因为它已经由你的几个参数确定如下:
- ICDF(0.05) = 第 5 个百分位数
- ICDF(0.25) = 第一个四分位数
- ICDF(0.5) = 中位数
- ICDF(0.75) = 第三个四分位数
- ICDF(0.95) = 第 95 个百分位数
但是,您还没有确定最小值和最大值,它们分别对应于ICDF(0)和ICDF(1);因此你必须估计它们。然后,您可以通过插值来填充逆 CDF 的缺失点。最简单的示例是线性插值,但其他更复杂的示例包括将曲线或样条拟合到逆 CDF 的点,例如 Catmull–Rom 样条。但是请注意,正确地说,逆 CDF 必须是单调非递减的。
另一方面,如果您可以访问基础数据点,而不仅仅是箱形图,则有 other methods you can use. Examples include kernel density estimations, histograms, or regression models (particularly for time series data). See also 。
举例如下:
import numpy
import scipy.interpolate as intrp
# Generate 100 random values based on 5 percentiles,
# minimum, and maximum
interp=intrp.interp1d([0.05,0.25,0.5, 0.75,0.95],[mn,p5,q1,p50,q3,p95,mx])
values=interp(numpy.random.random(size=100))
# Generate 100 random values based on 5 percentiles,
# extrapolating at ends
interp=intrp.interp1d([0.05,0.25,0.5, 0.75,0.95],
[p5,q1,p50,q3,p95],fill_value="extrapolate")
values=interp(numpy.random.random(size=100))
比方说,我有一个现有的箱线图:
median: 5,
q1: 2
q3: 6
5% percentile: 1
95% percentile: 2
我想按照这个分布生成 1,000,000 个随机值。
有办法吗?
我可以生成偏态正态分布,所以另一种方法是将箱线图值转换为偏态分布,但考虑到密度随着 alfa 的变化而变化,我不知道如何着手那。
按照分布生成随机数的最一般方法如下:
- 生成一个以 0 和 1 为界的均匀随机数(例如,
random.random()
)。 - 取该数字的逆 CDF(逆累积分布函数)。
结果是一个服从分布的数字。
在你的情况下,你已经很清楚逆 CDF (ICDF(x)
) 的外观,因为它已经由你的几个参数确定如下:
- ICDF(0.05) = 第 5 个百分位数
- ICDF(0.25) = 第一个四分位数
- ICDF(0.5) = 中位数
- ICDF(0.75) = 第三个四分位数
- ICDF(0.95) = 第 95 个百分位数
但是,您还没有确定最小值和最大值,它们分别对应于ICDF(0)和ICDF(1);因此你必须估计它们。然后,您可以通过插值来填充逆 CDF 的缺失点。最简单的示例是线性插值,但其他更复杂的示例包括将曲线或样条拟合到逆 CDF 的点,例如 Catmull–Rom 样条。但是请注意,正确地说,逆 CDF 必须是单调非递减的。
另一方面,如果您可以访问基础数据点,而不仅仅是箱形图,则有 other methods you can use. Examples include kernel density estimations, histograms, or regression models (particularly for time series data). See also
举例如下:
import numpy
import scipy.interpolate as intrp
# Generate 100 random values based on 5 percentiles,
# minimum, and maximum
interp=intrp.interp1d([0.05,0.25,0.5, 0.75,0.95],[mn,p5,q1,p50,q3,p95,mx])
values=interp(numpy.random.random(size=100))
# Generate 100 random values based on 5 percentiles,
# extrapolating at ends
interp=intrp.interp1d([0.05,0.25,0.5, 0.75,0.95],
[p5,q1,p50,q3,p95],fill_value="extrapolate")
values=interp(numpy.random.random(size=100))