顺序蒙特卡罗

时间:2017-11-15 10:05:40

标签: r statistics distribution normal-distribution montecarlo

我得到了这个模型,并获得了我应该模拟数据的概率。

x_1 ∼N(0, 102)

x_t =0.5 ∗ (x_t−1) + 25 · (x_t−1)/(1 + (x_t-1)^2) + 8 · cos(1.2 ∗ (t − 1)) + εt
, t = 2, 3, ..

y_t =(x_t)^2/25 + ηt, t = 1, 2, 3, ...

其中εT和ηt遵循正态分布。

我试图反转这个功能,但我不能这样做,因为我不知道我的X是正面的还是负面的。我明白我应该使用顺序蒙特卡罗,但我无法弄清楚如何找到算法的功能。什么是f和g,如果x(t-1)由于x平方而同样可能是正数还是负数,我们怎么决定呢?

算法:

1 Sample X1 ∼ g1(·). Let w1 = u1 = f1(x1)/g1(x1). Set t = 2

2 Sample Xt|xt−1 ∼ gt(xt|xt−1).

3 Append xt to x1:t−1, obtaining xt

4 Let ut = ft(xt|xt−1)/gt(xt|xt−1)

5 Let wt = wt−1ut , the importance weight for x1:t

6 Increment t and return to step 2

1 个答案:

答案 0 :(得分:1)

使用像你这样的时间序列模型,基本上计算x或y的概率分布的唯一方法是运行模型的多个模拟,随机绘制的值为x_0,eps_t,eta_t,然后构造直方图在所有运行中聚合样本。在非常特殊的情况下(例如阻尼布朗运动),可以用代数方式计算得到的概率分布,但我不认为你的模型有任何机会。

在Python中(我担心我在R中不够流利),你可以通过以下方式模拟时间序列:

import math, random    

def simSequence(steps, eps=0.1, eta=0.1):
    x = random.normalvariate(0, 102)

    ySamples = []

    for t in range(steps):
        y = (x ** 2) / 25 + random.normalvariate(0, eta)
        ySamples.append(y)

        x = (0.5 * x + 25 * x / (1 + x ** 2)
                + 8 * math.cos(1.2 * t) + random.normalvariate(0, eps))

    return ySamples

(这将替换你的t = 1..n,其中t = 0 ..(n-1)。)

然后,您可以生成y时间序列的几个示例图:

import matplotlib.pyplot as plt

nSteps = 100
for run in range(5):
    history = simSequence(nSteps)
    plt.plot(range(nSteps), history)
plt.show()

得到类似的东西: enter image description here

如果您想在不同时间计算y的概率分布,您可以生成一个矩阵,其列表示y_t在公共时间值的实现,并计算选定值t的直方图:

import numpy

runs = numpy.array([ simSequence(nSteps) for run in range(10000) ])
plt.hist(runs[:,5], bins=25, label='t=5', alpha=0.5, normed=True)
plt.hist(runs[:,10], bins=25, label='t=10', alpha=0.5, normed=True)
plt.legend(loc='best')
plt.show()

给出: enter image description here