我试图用PyMC实现大数定律的一个非常简单的例子。目标是生成不同大小样本的多个样本平均值。例如,在下面的代码中,我重复地取一组5个样本(samples_to_average=5),计算它们的平均值,然后找到结果跟踪的95%置信区间。在
下面的代码运行,但我想做的是将samples_to_average修改为一个列表,这样我就可以在一个过程中计算不同样本大小范围的置信区间。在
import scipy.misc
import numpy as np
import pymc as mc
samples_to_average = 5
list_of_samples = mc.DiscreteUniform("response", lower=1, upper=10, size=1000)
@mc.deterministic
def sample_average(x=list_of_samples, n=samples_to_average):
samples = int(n)
selected = x[0:samples]
total = np.sum(selected)
sample_average = float(total) / samples
return sample_average
def getConfidenceInterval():
responseModel = mc.Model([samples_to_average, list_of_samples, sample_average])
mapRes = mc.MAP(responseModel)
mapRes.fit()
mcmc = mc.MCMC(responseModel)
mcmc.sample( 10000, 5000)
upper = np.percentile(mcmc.trace('sample_average')[:],95)
lower = np.percentile(mcmc.trace('sample_average')[:],5)
return (lower, upper)
print getConfidenceInterval()
我见过的大多数使用确定性修饰符的例子都使用全局随机变量。但是,为了实现我的目标,我想我需要在getConfidenceInterval()中创建一个随机变量(长度正确),并将其传递给sample_average(而不是使用globals/default参数提供sample_average)。在
如何将在getConfidenceInterval()中创建的变量传递到sample_average()中,或者,我可以使用samples_to_average的不同值来评估多个模型?如果可能的话,我想避免使用全局变量。在
在回答你的问题之前,我想简化sample_average的编写方式,这样它就更简洁,更容易理解。在
现在可以将其推广到samples_to_average是一个参数数组的情况:
^{pr2}$getConfidenceInterval函数也必须更改,如下所示:
我使用vstack将样本平均值聚合到一个2D数组中,然后使用Numpy的percentile函数中的axis选项计算每列的百分位。在
相关问题 更多 >
编程相关推荐