2012-04-12 9 views
0

Ich habe folgenden Code eine Beispielfunktion zu schaffen und simulierte DatenVerwendung gilt Funktion 2 separate Listen in 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) 

} 

zu erzeugen, wenn I n_iterations angeben, werde ich eine 1x10 X_after Matrix und auch 1x10 Delta Matrix. Dann funktioniert die Funktion mean_detects mit diesem Befehl.

ave_detects <- mean_detects(X_after,delta) 

jedoch, wenn ich erhöhen n_iterations 5 zu sagen, dann werde ich habe 2 5x10 X_after und Delta dann die mean_detects Funktion funktioniert nicht mehr. Es gibt mir nur Ausgabe für 1 Iteration statt 5. Meine reale Simulation hat Tausende von Iterationen, so Geschwindigkeit und Speicher müssen ebenfalls berücksichtigt werden.

Bearbeitungen: Ich habe meinen Code basierend auf Ihren Kommentaren bearbeitet. Die von mir erstellte Funktion mean_detects sollte ein Beispiel für die gleichzeitige Verwendung von X_after- und delta-Matrizen zeigen. Die wirkliche Funktion ist sehr lang. Deshalb habe ich es hier nicht gepostet.

Antwort

2

Ihre eigentliche Frage ist nicht wirklich klar. So,

  1. "Meine Funktion nimmt nur 1 Datenframe".
    • Eigentlich nimmt Ihre Funktion in zwei Vektoren
  2. schreiben Code, der sowohl X_after und Delta verwenden können. Das bedeutet nicht wirklich etwas - Entschuldigung.
  3. "Geschwindigkeit und Speicher müssen berücksichtigt werden". Das ist vage. Wird dir der Speicher ausgehen? Als Vorschlag könnte man über einen rollenden Mittelwert nachdenken. Zum Beispiel

    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 
    

Neben

  1. Ihre dest2 Funktion erfordert die Variable n (die Sie nicht definiert haben).
  2. Ihre dest2-Funktion gibt keinen eindeutigen Wert zurück.

    mean(obs[cens==0]) 
    
:
  • Ihre mean_detects Funktion kann vereinfacht werden