2017-02-09 41 views
4

我在模擬r中的複合泊松過程。該過程由$ \ sum_ {j = 1}^{N_t} Y_j $定義,其中$ Y_n $是i.i.d序列無關的$ N(0,1)$值,$ N_t $是參數爲$ 1 $的泊松過程。我試圖在沒有運氣的情況下模擬這個。我有一個算法來計算這個如下: Simutale的CPP從0到T:在r中模擬複合泊松過程

啓動:$ K = 0 $

重複而$ \ sum_ {I = 1} ^ķT_i < T $

設置$ k = k + 1 $

模擬$ T_k \ SIM EXP(\拉姆達)$(在我的情況$ \拉姆達= $ 1)

模擬$ Y_K \ SIM N(0 ,1)$(這只是一個特殊情況,我希望能夠將其更改爲任何分配)

該軌跡由下式給出:其中$ N(t)= sup(k:\ sum_ {i = 1}^k T_i \ leq t) $

有人可以幫我在r中模擬這個,以便我可以繪製這個過程嗎?我已經嘗試過,但無法完成。

+0

你能夠使用'rnorm','rexp,'和'while'嗎?它可能很慢,但與其他任何編程語言無差異。你有什麼嘗試? – AdamO

回答

2

使用cumsum作爲確定時間N_t以及X_t的累計和。該說明性代碼指定模擬的次數,n,模擬n.t中的時間和x中的值以及(顯示它完成的)繪製軌跡。

n <- 1e2 
n.t <- cumsum(rexp(n)) 
x <- c(0,cumsum(rnorm(n))) 
plot(stepfun(n.t, x), xlab="t", ylab="X") 

Figure

這種算法,因爲它依賴於低級別的優化功能,速度快:我測試了它在六十歲系統將生成超過三百萬(時間,值)對每秒。


這通常用於模擬不夠好,但它並不完全符合的問題,這要求產生一個模擬出時間T.我們可以利用上面的代碼,但解決的辦法是有點麻煩。它計算出在時間T之前泊松過程中會發生多少次的合理上限。它會產生到達時間間隔。這被封裝在一個循環中,該循環將在實際上沒有達到時間T的(罕見)事件中重複該過程。

附加複雜度不會改變漸近計算時間。

T <- 1e2   # Specify the end time 
T.max <- 0   # Last time encountered 
n.t <- numeric(0) # Inter-arrival times 
while (T.max < T) { 
    # 
    # Estimate how many random values to generate before exceeding T. 
    # 
    T.remaining <- T - T.max 
    n <- ceiling(T.remaining + 3*sqrt(T.remaining)) 
    # 
    # Continue the Poisson process. 
    # 
    n.new <- rexp(n) 
    n.t <- c(n.t, n.new) 
    T.max <- T.max + sum(n.new) 
} 
# 
# Sum the inter-arrival times and cut them off after time T. 
# 
n.t <- cumsum(n.t) 
n.t <- n.t[n.t <= T] 
# 
# Generate the iid random values and accumulate their sums. 
# 
x <- c(0,cumsum(rnorm(length(n.t)))) 
# 
# Display the result. 
# 
plot(stepfun(n.t, x), xlab="t", ylab="X", sub=paste("n =", length(n.t))) 
+0

非常感謝,這對我非常有幫助。是否有可能獲得更好的情節?即在每個點周圍都不顯示圓圈的那個? – Slangers

+0

是:查看'?plot.stepfun'上的幫助頁面。它告訴你在最後一行調用'plot'時包含參數'do.points = FALSE',並且描述了用於控制繪圖外觀的其他選項。 – whuber

+0

非常感謝! :) – Slangers