统计效率低下(块平均值)

时间:2012-10-02 16:22:33

标签: r statistics

我有一系列数据,这些数据是通过分子动力学模拟得到的,因此在时间上是连续的并且在某种程度上是相关的。我可以将平均值计算为数据的平均值,我想估算与以这种方式计算的平均值相关的误差。

根据this book,我需要计算“统计无效率”,或大致计算系列数据的相关时间。为此,我必须将系列划分为不同长度的块,并且对于每个块长度(t_b),块平均值的方差(v_b)。然后,如果整个序列的方差是v_a(即,当t_b = 1时为v_b),我必须获得(t_b * v_b / v_a)的t_b趋于无穷大的限制,这就是效率低下的问题。

然后,均值误差为sqrt(v_a * s / N),其中N是总点数。所以,这意味着每个s点只有一个是不相关的。

我认为这可以用R完成,也许有一些包已经做到了,但我是R的新手。有谁能告诉我怎么做?我已经找到了如何阅读数据系列并计算均值和方差。

根据要求提供数据样本:

# t(ps) dH/dl(kJ/mol)
0.0000 582.228
0.0100 564.735
0.0200 569.055
0.0300 549.917
0.0400 546.697
0.0500 548.909
0.0600 567.297
0.0700 638.917
0.0800 707.283
0.0900 703.356
0.1000 685.474
0.1100 678.07
0.1200 687.718
0.1300 656.729
0.1400 628.763
0.1500 660.771
0.1600 663.446
0.1700 637.967
0.1800 615.503
0.1900 605.887
0.2000 618.627
0.2100 587.309
0.2200 458.355
0.2300 459.002
0.2400 577.784
0.2500 545.657
0.2600 478.857
0.2700 533.303
0.2800 576.064
0.2900 558.402
0.3000 548.072

......这一直持续到500 ps。当然,我需要分析的数据是第二列。

3 个答案:

答案 0 :(得分:1)

假设x持有数据序列(例如,来自第二列的数据)。

v = var(x)
m = mean(x)
n = length(x)

si = c()
for (t in seq(2, 1000)) {
    nblocks = floor(n/t)
    xg = split(x[1:(nblocks*t)], factor(rep(1:nblocks, rep(t, nblocks))))
    v2 = sum((sapply(xg, mean) - m)**2)/nblocks
    #v rather than v1
    si = c(si, t*v2/v)
}
plot(si)

下图是我从一些时间序列数据中得到的。当si的曲线变得近似平坦(斜率= 0)时,您有t_b的下限。另见http://dx.doi.org/10.1063/1.1638996

statistical inefficiency of a time series

答案 1 :(得分:1)

为问题做出贡献永远不会太晚,不是吗? 由于我自己正在进行一些分子模拟,我确实尝试了这个问题但是没有看到这个线程。我发现艾伦& amp;与现代错误分析方法相比,Tildesley似乎有点过时了。本书的其余部分是值得一看的好事。

虽然Sunhwan Jo关于块平均法的答案是正确的,但是关于错误分析,你可以在这里找到其他方法,例如jacknife和bootstrap方法(彼此密切相关):http://www.helsinki.fi/~rummukai/lectures/montecarlo_oulu/lectures/mc_notes5.pdf

简而言之,使用bootstrap方法,您可以从数据中生成一系列随机人工样本,并计算新样本所需的值。我写了一小段Python代码来处理一些数据(不要忘记导入numpy或我使用的函数):

def Bootstrap(data):
    B  = 100 # arbitraty number of artificial samplings
    es = 0.
    means = numpy.zeros(B)
    sizeB = data.shape[0]/4 # (assuming you pass a numpy array)
                            # arbitrary bin-size proportional to the one of your
                            # sampling.
    for n in range(B):
        for i in range(sizeB):
        # if data is multi-column array you may have to add the one you use
        # specifically in randint, else it will give you a one dimension array.
        # Check the doc.
            means[n] = means[n] + data[numpy.random.randint(0,high=data.shape[0])] # Assuming your desired value is the mean of the values
                                             # Any calculation is ok.
            means[n] = means[n]/sizeB
    es = numpy.std(means,ddof = 1)
    return es

我知道它可以升级,但它是第一枪。根据您的数据,我得到以下信息:

Mean              =  594.84368
Std               =   66.48475
Statistical error =    9.99105

我希望这可以帮助任何人在数据统计分析中遇到这个问题。如果我错了或其他任何事情(第一篇文章和我不是数学家),欢迎任何更正。

答案 2 :(得分:0)

有几种不同的方法可以计算统计效率低下或整合自相关时间。 R中最简单的是CODA包。它们有一个函数effectiveSize,它为您提供有效的样本大小,即样本总数除以统计无效率。平均值标准差的渐近估计值为sd(x)/sqrt(effectiveSize(x))

require('coda')
n_eff = effectiveSize(x)