確率積分のシミュレーション


7

私はp。運動3.9.10を解決しようとしています。Ubbo F. Wiersemaの「ブラウン運動微積分」(ジョン・ワイリー・アンド・サンズ、2008年)の66確率論的積分をシミュレートするように求め、

01B(t) dB(t)
最初にパーティションを使用する [0,1]n=28 サブインターバルと実行 1000 離散確率積分のシミュレーション
I(n)=i=0n1B(ti)(B(ti+1)B(ti))
このため n、次に繰り返し2倍にしてこの手順を繰り返す n211。演習では、結果を積分の閉形式の平均および分散と比較するよう求めます。
01B(t) dB(t)=12B(1)212
どれが 0 そして 12、それぞれ( B(1) は標準の正規確率変数です)。

以下に示すように、Rでシミュレーションを作成しました。ただし、このシミュレーションから得られる分散は

> v_sim
        8         9        10        11 
0.4771895 0.4304475 0.5260542 0.4664552

期待値に収束していないように見える 0.5。シードを次のように変更すると、同じ現象が観察されます2 そして 3 同様に、サブインターバルの数が 212215。何が悪いのですか?

NSIMS <- 1000L # number of simulations of the integral for every "level"
LEVELS <- 8L:11L # level n corresponds to 2^n sample points between 0 and 1
SEED <- 1

set.seed(SEED)

sims <- data.frame(simid = 1L:NSIMS) # sims contains one colum per every level.
                                        # The column simid is a dummy column
                                        # intended to avoid an error message
                                        # when columns are added to sims
                                        # on the fly inside the following loop.
                                        # This column is deleted after the loop
                                        # ends.
for (n in LEVELS)
{
        nticks <- 2^n # nticks is the number of sample points between 0 and 1
        delta <- 1/nticks
        ticks <- seq(from = 0, to = 1, by = delta)
        std <- sqrt(delta)
        sim <- vector(mode = "numeric", length = NSIMS)
        for (j in 1L:NSIMS)
        {
                b <- cumsum(c(0, rnorm(nticks, sd = std))) # b is a simulated
                                                        # Brownian motion path
                                                        # sampled at the tick
                                                        # marks.
                integral <- 0
                for (i in 1L:(length(b) - 1L))
                {
                        integral <- integral + b[i]*(b[i + 1] - b[i])
                }
                sim[j] <- integral
        }
        sims[, as.character(n)] <- sim
}
sims$simid <- NULL

m_sim <- sapply(sims, mean)
v_sim <- sapply(sims, var)

各nで分散を計算しましたか?正確に0.5になることは決してないので、0.5であるという帰無仮説を棄却できるかどうかを判断する必要があります。
Greg Petersen

@GregPetersen:正確に表示されるとは思わない 0.5、しかし私は一貫した収束を期待しています 0.5、例えば 0.4771895,0.48044750.51605420.4964552
Evan Aad

2
プログラムは本来あるべきことを実行しますが、より単純かつ効率的にすることができます。ループのcumsum代わりにa を使用してiください。ここでは、マトリックス/適用がデータフレーム/適用などよりも優先される場合があります。これは非常に良い演習です。ヒント:何を見つけたいのか、なぜそうするのかを明確に述べてください。n 合計された変数は言う Xi
イブ

回答:


4

0.5からの分岐点が2つあり、そのうちの1つだけを変更しています。結果として、あなたが提案するような収束を期待することはできません。[代わりに、少しでも改善が見られると期待しますn 値を上げるとノイズに消えます n さらに。]

発散の最初の原因は、質問で認識されます。離散近似による連続プロセスの近似です。

2番目の原因は、シミュレーションによるランダムな変動です。有限数のシミュレーションで(b)、サンプル変動の計算は、任意の特定の離散近似で得られる基本的な「真の」値とは異なることが予想されます。 b

これが本当に問題であるかどうかを確認するには、一連の n 各値で、n = 100,1000,10000(および可能であればそれ以上)と言います n。または、出力する量の理論的分散(したがって標準誤差)を計算できます。これから、結果が1/2と明らかに矛盾しているかどうかを判断できます(n 大きくなると、はるかに大きな値を必要とするため、不整合が見にくくなります。 b 特定する)。


4

しましょう Xi:=B(ti)[B(ti+1)B(ti)] ために i=0n1。rv.s Xi の増分が独立しているため、ガウスで独立しています B(t)。しかもE(Xi)=0 そして

Var(Xi)=E[Xi2]=E[B(ti)2]E[(B(ti+1)B(ti))2]=ti(ti+1ti),
そう Var(Xi)=i/n2 ポイント ti:=i/n使用されています。その後
Var(I(n))=i=0n1Var(Xi)=1n2i=0n1i=1n2(n1)n2=[11n]12.
任期まで 1/n、の分布 I(n) すべてのほぼ同じまま n。数字を描くことでNsim、独立した I(n)、サイズのサンプルを取得します Nsim わずかにのみ依存する分布から n そしてそれは平均でほぼ正常です 0 と分散 1/2。したがって、プログラムでは、v_sim対応するの要素は、nn小さい場合を除いて)サイズの独立したサンプルの分散です。Nsim から Norm(0,1/2)

番号 n考慮される特定の被積分関数のため、ポイントの数はここではほとんど無関係です。状況は非確率的積分の評価と比較できます01tdt台形規則を使用します。台形をさらに使用しても、結果は変わりません。異なる適応プロセスまたは関数が被積分関数として使用された場合、明らかに密度の高い設計とは異なります[ti]i その後、より小さなバイアスにつながります。


2
小さな誤植正方形が欠けている最初の表示式で考える。
jdods 2017年

0

収束をシミュレートするには、nステップに基づく積分と2nステップに基づく積分との差の2乗の平均をシミュレートします。次に、2nステップと4nステップの積分の差についても同じです。次に、4nステップと8nステップの違い。すべてに対して、同一のブラウン運動軌跡(単位期間内)を使用します。上記の積分のペア間のDIFFERENCEの分散を使用すると、同じ収束パターンを確認できます。私の本のセクション3.4はこれをカバーしています。ウボ


-2

3.9.10 BdB.R

積分B.dB

演習3.9.10を次のように言い換えます。

Repeatで始まる8行目まで5行目以降を削除

Compareで始まる文も削除する

set.seed(123)#オプション; 正の整数のシミュレーション<-1000#シミュレーションの数

BdB.sim <-function(n){B.steps <-2 * n#ブラウン運動パスのタイムステップ数

# integrals B.dB based on successively halved time partitions
I.n <-  numeric(sims)  # n steps
I.2n <- numeric(sims)  # 2*n steps

dt <- 1/B.steps
sqrt.dt <- sqrt(dt)
k.max <- 1+B.steps     # last timepoint index of B

# timepoints
# ---------------------------------------
k.seq.n <- seq(from=3,to=k.max,by=2)
length(k.seq.n)

k.seq.2n <- seq(from=2,to=k.max,by=1)
length(k.seq.2n)

k.seq.step <- seq(from=3,to=k.max-1,by=2)
length(k.seq.step)
# ---------------------------------------

for(sim.nr in 1:sims) {
    # each simulation starts by generating a Brownian Motion path of n timesteps, denoted B
    B <- c(0,cumsum(rnorm(B.steps,mean=0,sd=sqrt.dt)))  # Brownian Motion path timestep dt; B[1]=0
    for(k in k.seq.n) {I.n[sim.nr] <- I.n[sim.nr] + B[k-2]*(B[k]-B[k-2])}
    for(k in k.seq.2n) {I.2n[sim.nr] <- I.2n[sim.nr]  + B[k-1]*(B[k]-B[k-1])}
}

mean.sq.diff <- mean((I.n-I.2n)^2)
exact <- 1/(4*n)

return(data.frame(n=n,double=2*n,mean.sq.diff=mean.sq.diff,exact=exact))

}

(n.seq <-c(2 ^ 8、2 ^ 9、2 ^ 10,2 ^ 11))

トレイル<-data.frame(n = NA、double = NA、mean.sq.diff = NA、exact = NA)

for(m in 1:length(n.seq)){out <-BdB.sim(n.seq [m])trail <-rbind(trail、out)}

Trail [-1、]#収束を示します

write.csv(trail [-1、]、 "3.9.10 BdB convergence.csv"、row.names = FALSE)#オプション

--------------------------

ウボウィエルセマ2018年2月26日


連続するnの累乗の場合、1 / 4nに対する比率1 /(4(n + 1))はn /(n + 1)に等しく、nは2の累乗であるため、その比率はequalに等しくなります。時間間隔の数が2ⁿから2ⁿ⁺¹に増加すると、平均二乗差は半分に減少します。
user186735
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.