2012-04-12 8 views
0

に2つの別々のリストに関数を適用するIサンプル関数を作成し、シミュレートされたデータも利用R

mean_detects<- function(obs,cens) { 
detects <- obs[cens==0] 
nondetects <- obs[cens==1] 
res <- mean(detects) 
return(res) 
} 

mu <-log(1); sigma<- log(3); n_samples=10, n_iterations = 5; p=0.10 
dset2 <- function (mu, sigma, n_samples, n_iterations, p) { 
    X_after <- matrix(NA_real_, nrow = n_iterations, ncol = n_samples) 
    delta <- matrix(NA_real_, nrow = n_iterations, ncol = n_samples) 
    lod <- quantile(rlnorm(100000, mu, sigma), p = p) 
    pct_cens <- numeric(n_iterations) 
    count <- 1 
    while(count <= n_iterations) {  
    X_before <- rlnorm(n_samples, mu, sigma) 
    X_after[count, ] <- pmax(X_before, lod) 
    delta [count, ] <- X_before <= lod 
    pct_cens[count] <- mean(delta[count,]) 
    if (pct_cens [count] > 0 & pct_cens [count] < 1) count <- count + 1 } 
    ave_detects <- mean_detects(X_after,delta) ## how can I use apply or other functions here? 
    return(ave_detects) 

} 

Iはn_iterationsを指定した場合、私は1×10 X_afterマトリックスを有し、1×10デルタを生成するために、次のコードを持っていますマトリックス。次に、このコマンドを使用して、mean_detects関数が正常に機能します。私は、私は2 5×10 X_afterとデルタを持つことになります、5を言うためにn_iterationsを増やすとき

ave_detects <- mean_detects(X_after,delta) 

しかし、その後mean_detects機能はもはや動作しません。実際のシミュレーションには何千もの反復があり、速度とメモリも考慮する必要があります。

編集:あなたのコメントに基づいて自分のコードを編集しました。私が作成したmean_detects関数は、X_afterとデルタ行列を同時に使用する例を示すことを意図していました。実際の機能は非常に長いです。だから私はここにそれを掲示しなかったのです。

答えて

2

あなたの実際の質問は本当に明確ではありません。したがって、

  1. "私の関数は1つのデータフレームしか取りません"。
    • 実際にあなたの関数はX_afterとデルタの両方を使用できる2つのベクトル
  2. 書き込みコードになります。これは本当に何も意味しません - 申し訳ありません。
  3. "速度とメモリを考慮する必要があります"。これは曖昧です。あなたの記憶がなくなりますか?提案として、あなたはローリング・メリットについて考えることができます。例えば、

    x = runif(5) 
    total = 0 
    for(i in seq_along(x)) { 
        total = (i-1)*total/i + x[i]/i 
        cat(i, ": mean ", total, "\n") 
    } 
    1 : mean 0.4409 
    2 : mean 0.5139 
    3 : mean 0.5596 
    4 : mean 0.6212 
    5 : mean 0.6606 
    

別に

  1. あなたdest2機能は(あなたが定義されていない)変数nが必要です。
  2. dest2関数は明白な値を返しません。
  3. あなた mean_detects機能がに簡素化することができる
  4. mean(obs[cens==0])