0

我有以下代码来创建示例函数并生成模拟数据

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) 

}

如果我指定 n_iterations,我将有一个 1x10 X_after 矩阵和 1x10 delta 矩阵。然后 mean_detects 函数使用此命令可以正常工作。

ave_detects <- mean_detects(X_after,delta) 

但是,当我将 n_iterations 增加到 5 时,我将有 2 个 5x10 X_after 和 delta,然后 mean_detects 函数不再起作用。它只为我提供 1 次迭代而不是 5 次的输出。我的真实模拟有数千次迭代,因此还必须考虑速度和内存。

编辑:我根据您的评论编辑了我的代码。我创建的 mean_detects 函数旨在展示同时使用 X_after 和 delta 矩阵的示例。真正的功能很长。这就是为什么我没有在这里发布它。

4

1 回答 1

2

你的实际问题不是很清楚。所以,

  1. “我的函数只接受 1 个数据帧”。
    • 实际上你的函数有两个向量
  2. 编写可以同时使用 X_after 和 delta 的代码。这并不意味着什么——对不起。
  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功能可以简化为:

    mean(obs[cens==0])
    
于 2012-04-12T07:51:34.250 回答