我得到了这个模型,并获得了我应该模拟数据的概率。
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
答案 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()
如果您想在不同时间计算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()