在Julia中估计概率分布并从中抽样

Cha*_*hai 5 distribution kernel-density julia

我试图使用Julia估计使用N个观察数据点(存储为Float64数字数组)的连续单变量分布,然后从该估计分布中进行采样.我没有先前的知识限制对某些发行家族的关注.

我正在考虑使用KernelDensity包来估计分布,但我不确定如何从结果输出中进行采样.

任何帮助/提示将不胜感激.

Dan*_*etz 6

对估计分布没有任何限制,自然候选者将是经验分布函数(参见维基百科).对于这种分布,有关于收敛到实际分布的非常好的定理(参见Dvoretzky-Kiefer-Wolfowitz不等式).

通过这种选择,采样特别简单.如果dataset是当前样本的列表,则dataset[rand(1:length(dataset),sample_size)]是来自经验分布的一组新样本.使用Distributions包,它可以更具可读性,如下所示:

using Distributions
new_sample = sample(dataset,sample_size)
Run Code Online (Sandbox Code Playgroud)

最后,核密度估计也很好,但可能需要选择一个参数(内核及其宽度).这显示了对某个分布族的偏好.从内核分布中抽样与从经验分布中抽样惊人地相似:1.从经验分布中选择样本; 2.使用来自核函数的样本扰动每个样本.

例如,如果核函数是宽度的正态分布w,那么扰动的样本可以计算为:

new_sample = dataset[rand(1:length(dataset),sample_size)]+w*randn(sample_size)
Run Code Online (Sandbox Code Playgroud)

  • @Chai我只是想我会补充说DanGetz在这个非常好的答案中提出的是,出于所有实际目的,是*iid*bootstrap.请注意,如果您的数据不是*iid*(例如,如果它是时间序列数据),那么您可能需要使用更强大的采样方案,例如,如果您希望重采样数据显示相同的统计数据,请参阅例如依赖引导程序属性作为原始数据. (4认同)
  • BTW,@ DanGetz,我认为代码片段new_sample = dataset [rand(1:length(dataset),sample_size)+ w*randn(sample_size)在噪声项之前缺少一个结束方括号,应该是:new_sample = dataset [rand(1:length(dataset),sample_size)+ w*randn(sample_size)我不能自己编辑这个(编辑太短......),但对于任何看到这个的人来说都很好未来.你能做这个编辑吗?谢谢! (2认同)
  • @ARM如果你需要做一个依赖的bootstrap我已经为它编写了一个包[这里](https://github.com/colintbowers/DependentBootstrap.jl).我还没有将它添加到元数据中,但我希望在v0.5中更新它,并在接下来的一两个月内添加一些时间. (2认同)