R:统计/计算效率

Tan*_*ene -2 performance r distribution matrix

我的代码块正在做的是用T的F填充4X100000矩阵.让我们命名矩阵X.然后是Xij~Bernoulli(P)和P~normal(0.5,0.15),其中max(P)= 1并且min(P)= 0.

统计数据非常低效.如果有上述过程坚持的分布请帮助我.

计算速度非常慢,因为我必须用1个条目填充整个矩阵1条目,每次都是随机的.有没有办法减少显着的时间?这是非常低效的.

统计效率问题在这里

x = rnorm(100000,mean = 0.5,sd = 0.15)
x[x > 1] = 1
x[x < 0] = 0

probability = function(x){
  x.sam = sample(x,1)
  p = c(x.sam,1-x.sam)
  return(p)
}

aggro2 = function(x){
  aggro2 = sample(c(T,F),1, prob = probability(x))
  return(aggro2)
}
Run Code Online (Sandbox Code Playgroud)

计算效率问题在这里

ptm = proc.time()
aggro =c()
n=100000
for (i in 1:(4*n)){
  cat(round(i/(4*n)*100,2),"\n")
  aggro = c(aggro, aggro2(x))  
}
aggro.mat = matrix(aggro,4,n)

elapsed = proc.time()[3] - ptm[3]
cat(elapsed)
Run Code Online (Sandbox Code Playgroud)

Ben*_*ker 7

这个怎么样?

system.time({
    x <- rnorm(400000,mean = 0.5,sd = 0.15)  ## pick normal variables
    x2 <- pmin(1,pmax(0,x))                  ## bound at 0 and 1
    mids <- which(x2>0 & x2<1)
    x2[mids] <- rbinom(length(mids),prob=x2[mids],size=1)  
    res <- matrix(x2,ncol=4)
})
Run Code Online (Sandbox Code Playgroud)

这似乎与您正在做的完全相同,但似乎(?)与您的描述相符.

经过时间:0.443秒

你正在做的一些事情会不必要地缓慢:

  • 使用for循环而不是矢量化
  • 通过追加而不是分配整个向量然后替换元素来创建向量
  • for循环过程中打印

  • +1伟大(和快速)答案.我花了一点时间来理解它.聪明地使用pmin和pmax,也没有不必要地以1和0的概率对随机变量进行采样! (2认同)
  • 这不是真的!`rbinom`在`size`(在这种情况下无关)和`prob`上进行矢量化.你有相反的证据吗? (2认同)