2013-05-25 192 views
-2

我的代碼塊的功能是填充一個4X100000矩陣,其中T爲F. 命名爲矩陣X.然後Xij_Beroulli(P)和P_normal(0.5, 0.15)其中max(P)= 1且min(P)= 0。R:統計/計算效率

統計效率非常低。如果有上述過程遵循的分佈,請也幫助我。

計算速度很慢,因爲我必須填寫整個矩陣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) 
} 

計算效率這裏

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) 

回答

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) 
}) 

這似乎與您正在做的不完全相同,但看起來(?)符合您的描述。

經過時間:0.443秒

幾個,你正在做的將是緩慢的不必要的事情:使用for循環,而不是向量化

  • 通過附加,而不是創建一個矢量

    • 分配整個矢量,然後替換元素
    • for循環過程中打印
  • +2

    +1好(快)的答案。花了我一點時間來理解它。巧妙地使用pmin和pmax,並且不會不必要地對概率爲1和0的隨機變量進行抽樣! –

    +0

    二項分佈不合適,但否則只是光華!謝謝! –

    +0

    「二項分佈不合適」是什麼意思? 'rbinom(n,prob,size = 1)'是'n'伯努利試驗的樣本,概率爲'prob' ...這就是我以爲你想要的東西 –