2016-04-29 36 views
1

我得到了一段R代碼,如下所示,以找出最後一行中的Y值,每次運行時,R將給出100個Y值,因爲我設置了N = 100作爲模擬開始...R中的模擬for循環

我要模擬它500次以找到500個Y系列。每個模擬包含100個Y值。結果,我想要得到像500行模擬的矩陣,每行包含100個Y值。我想一個for循環會有所幫助,但我沒有弄清楚如何做到這一點?任何人都可以幫忙嗎?非常感謝!!!!!!

N = 100 
# set up initial values 
alpha1 = 8.439e-02 
beta1 = 8.352e-01 
mu = 7.483e-03 
omega = 1.343e-04 
X_0 = -3.092031e-02 
sigma_0 = 0.03573968 
eps = rt (N,7.433e+00) 

# loops 
Xn= numeric (N) 
sigma= numeric (N) 
sigma[1] = sigma_0 
Xn[1] = X_0 
for (t in 2:N){ 
    sigma[t] = sqrt (omega + alpha1 * (Xn[t-1])^2 + beta1* (sigma[t-1])^2) 
    Xn[t] = sigma[t] * eps[t] 
} 
Y = mu + Xn 
head(Y) 
+0

你的算法是確定的('EPS <旁 - RT(..)'),所以進一步的簡化是可能的。 – jogo

回答

1

把所有的功能getY <- function(N) { ... }和使用replicate(500, getY(100))。所以,你可以這樣做:

getY <- function(N) { 
    # set up initial values 
    alpha1 <- 8.439e-02 
    beta1 <- 8.352e-01 
    mu  <- 7.483e-03 
    omega <- 1.343e-04 
    X_0 <- -3.092031e-02 
    sigma_0 <- 0.03573968 
    eps  <- rt(N, 7.433e+00) 

    # loops 
    Xn <- numeric (N) 
    sigma <- numeric (N) 
    sigma[1] <- sigma_0 
    Xn[1] <- X_0 
    for (t in 2:N) { 
    sigma[t] <- sqrt (omega + alpha1 * (Xn[t-1])^2 + beta1* sigma[t-1])^2) 
    Xn[t] <- sigma[t] * eps[t] 
    } 
    Y <- mu + Xn 
} 

X <- replicate(500, getY(100)) 

如果你願意,你可以用t()轉的結果,即

X <- t(replicate(500, getY(100))) 
+0

感謝Jogo回答!我試過你的代碼,我得到的矩陣有100行,500列,但是我正在尋找其他方法,即500行和100列?謝謝 – Amanda

+0

't(X)'用於轉置 – jogo

+0

再次感謝Jogo給予您的幫助!請問關於矩陣的進一步問題嗎?我現在有500 * 100的矩陣,我想做以下代碼:#r將矩陣的每一行 W0 = 100 E = 20 constant = exp(cumsum(r)) exp.cum = cumsum(1 /常數) w = const *(W0 - exp.cum) - E w – Amanda