簡體   English   中英

使用Apply for Simulation而不是嵌套的for循環

[英]Using apply for simulation instead of nested for loops

我用R復制了最初在Stata中完成的模擬。 我使用了“ for”循環,因為這是我知道如何進行此工作的唯一方法。 它需要很長時間才能運行,因此我想使用“ apply”命令之一來查看它是否更快,但是我不知道該怎么做。 有人可以幫忙嗎? 這是代碼:

simdiffuse <- function(a, b, c, d) {

  endo <- 1/a        # innovation endogenous effect
  endomacro <- 1/b   # category endogenous effect
  appeal <- c        # innovation's ex ante appeal
  ninnov <- d        # number of innovations in category 

  results <- data.frame(catdensity = rep(0:ninnov, each = 25), t = 1:25, endo = endo, endomacro = endomacro, appeal = appeal, adopt = NA)    

  prop <- rnorm(1000)
  diff <- data.frame(prop)
  diff$adopt <- 0
  diff$adopt[1:5] <- 1

  for (catdensity in 0:ninnov) {
    diff$adopt <- 0
    diff$adopt[1:5] <- 1

    for (t in 1:25) {
      results[results$catdensity == catdensity & results$t == t,]$adopt <- mean(diff$adopt)
      for (obs in 1:nrow(diff)) {
        if(appeal+(mean(diff$adopt)*endo)+(catdensity*endomacro) > rnorm(1, diff[obs,]$prop)) diff[obs,]$adopt <- 1
      }
    }
  }
  return(results)
}

results <- simdiffuse(.2, 20, -3, 60)

您可以使用data.table來提高功能的速度。 但是,您仍然必須使用for循環(這不是一件壞事)。

library(data.table)
simdiffuse <- function(a, b, c, d) {

  endo <- 1/a        # innovation endogenous effect
  endomacro <- 1/b   # category endogenous effect
  appeal <- c        # innovation's ex ante appeal
  ninnov <- d        # number of innovations in category 

  results <- data.table(catdensity = rep(0:ninnov, each = 25), t = 1:25, 
                        endo = endo, endomacro = endomacro, appeal = appeal, 
                        adopt = as.numeric(NA))    


  for (cc in 0:ninnov) {
    diff <- data.table(prop = rnorm(1000), adopt = c(rep(1,5), rep(0, 995)))
    for (tt in 1:25) {
      results[catdensity == cc & t == tt, adopt := diff[, mean(adopt)]]
      diff[, rr := rnorm(1, prop), by="prop"]
      diff[appeal + mean(adopt) * endo + cc * endomacro > rr, adopt := 1]
    }
  }
  return(results)
}

results <- simdiffuse(.2, 20, -3, 60)

我沒有足夠的時間等到您的代碼執行完畢,但是這是我得到的adopt vs. t的圖表:

領養vs.t,按密度分組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM