在 Python 中从 Weibull 分布中采样特定数量的点
Posted
技术标签:
【中文标题】在 Python 中从 Weibull 分布中采样特定数量的点【英文标题】:Sampling a specific number of points from a Weibull distribution in Python 【发布时间】:2018-05-01 17:32:46 【问题描述】:我有一个数据集(大约 1,000 棵树的直径),我从中得出了平均树直径 (21.6”) 和标准偏差 (12.4”)。我的分析表明这些数据来自 Weibull 分布 (numpy.random.weibull)。
我想运行 Monte Carlo 模拟来生成一系列遵循此数据分布的假设森林 - 也就是说,将我的数据从 1,000 棵树外推到直径为 80,000 棵树的森林,该森林直径从我的 Weibull 分布中采样。
为了实现这一点,我想在 Python 中:
-
使用我的数据集的均值和标准差创建 Weibull 分布
从此分布中采样 20 次以创建这些假设的森林大小分布,其中每个森林有大约 80,000 个点
将这些表格导出到 Excel 中(我推测)以便使用此信息来计算基于直径的森林生物量和碳储存量
我是 stats 和 Python 的完整初学者,并且正在从 scipy 文档中苦苦挣扎可以导出的方式。
对于在构建问题时出现的任何错误或含糊之处,请提前致歉——编码和统计数据的学习曲线肯定很陡峭!
【问题讨论】:
您没有使用均值和方差指定 Weibull 分布(就像使用高斯分布一样)。看看这个链接:Weibull distribution: from mean and variance to shape and scale factor 哎呀,感谢您的现实检查。我认为目前这可能超出了我的技能水平,尤其是与 Python(与 Matlab 相比)没有可比性。也许将 Weibull 部分放在一边:关于如何从不同分布(例如对数正态)中采样的任何见解? 你有原始数据,还是只有平均值和标准。开发者? 我有原始数据,从中我得出均值和标准差。开发。在 JMP 中。 【参考方案1】:老问题,但如果有人遇到它,您可以将数据集的均值和标准差转换为 Weibull 分布的参数。
关于如何做到这一点的好答案here。
我们可以在python中实现这个
mu = 21.6
std = 12.4
k = (std/mu)**(-1.086)
lambda_ = mu / (gamma(1 + 1./k))
k, lambda_
(1.8270937149009134, 24.30584398186227)
然后,您可以使用 numpy 模拟 80,000 个新值。您可以将其保存为 csv,该文件可以在 Excel 中使用 pandas 打开。
from numpy.random import weibull
import pandas as pd
synthetic_samples = lambda_ * weibull(k, 80_000)
pd.DataFrame(synthetic_samples).to_csv('new_forest.csv')
【讨论】:
以上是关于在 Python 中从 Weibull 分布中采样特定数量的点的主要内容,如果未能解决你的问题,请参考以下文章
使用 stats.exponweib.fit 在 python 中拟合 Weibull 分布
如何在 Python 中使用 Kullback-Leibler 方法最小化 Weibull 分布的参数?
如何使用 Python 获得 Weibull 分布的置信区间?