我試圖做的通用版本是進行仿真研究,在該仿真研究中我操縱一些變量以查看結果如何影響結果。我遇到了一些與速度有關的問題。最新的仿真工作只需幾次迭代(每個實驗10次)。但是,當我進行大規模(每個實驗10k)版本時,仿真已經運行了14個小時(並且仍在運行)。通過代碼優化加速R中的仿真
下面是我正在運行的代碼(帶有註釋)。作爲R的新手,我正在努力優化模擬效率。我希望從這裏提供的意見和建議中學習,以優化此代碼並將這些評論用於未來的仿真研究。
讓我來談談這段代碼應該做些什麼。我操縱兩個變量:效果大小和樣本大小。每個組合運行10k次(即,每個條件10k個實驗)。我初始化一個數據框來存儲我的結果(稱爲結果)。我循環了三個變量:效應大小,樣本大小和迭代(10k)。
在循環中,我初始化了四個NULL組件:p.test,p.rep,d.test和d.rep。前兩者捕獲初始t檢驗的p值和複製的p值(在類似條件下複製)。後兩者計算效應大小(Cohen's d)。
我從控制條件(DVcontrol)的標準法線生成我的隨機數據,並且使用我的效應大小作爲實驗條件(DVexperiment)的平均值。我將這些值區分開來,並將結果投射到R(配對樣本t檢驗)中的t檢驗函數中。我將結果存儲在一個名爲Trials的列表中,並將其與結果數據框綁定。這個過程重複10k次直到完成。
# Set Simulation Parameters
## Effect Sizes (ES is equal to mean difference when SD equals Variance equals 1)
effect_size_range <- seq(0, 2, .1) ## ES
## Sample Sizes
sample_size_range <- seq(10, 1000, 10) ## SS
## Iterations for each ES-SS Combination
iter <- 10000
# Initialize the Vector of Results
Results <- data.frame()
# Set Random Seed
set.seed(12)
# Loop over the Different ESs
for(ES in effect_size_range) {
# Loop over the Different Sample Sizes
for(SS in sample_size_range) {
# Create p-value Vectors
p.test <- NULL
p.rep <- NULL
d.test <- NULL
d.rep <- NULL
# Loop over the iterations
for(i in 1:iter) {
# Generate Test Data
DVcontrol <- rnorm(SS, mean=0, sd=1)
DVexperiment <- rnorm(SS, mean=ES, sd=1)
DVdiff <- DVexperiment - DVcontrol
p.test[i] <- t.test(DVdiff, alternative="greater")$p.value
d.test[i] <- mean(DVdiff)/sd(DVdiff)
# Generate Replication Data
DVcontrol <- rnorm(iter, mean=0, sd=1)
DVexperiment <- rnorm(iter, mean=ES, sd=1)
DVdiff <- DVexperiment - DVcontrol
p.rep[i] <- t.test(DVdiff, alternative="greater")$p.value
d.rep[i] <- mean(DVdiff)/sd(DVdiff)
}
# Results
Trial <- list(ES=ES, SS=SS,
d.test=mean(d.test), d.rep=mean(d.rep),
p.test=mean(p.test), p.rep=mean(p.rep),
r=cor(p.test, p.rep, method="kendall"),
r.log=cor(log2(p.test)*(-1), log2(p.rep)*(-1), method= "kendall"))
Results <- rbind(Results, Trial)
}
}
預先感謝您的意見和建議, 喬希
這似乎是它屬於[codereview.se]而不是在這裏。 –
@JohnColeman我認爲這是兩個網站上的主題。這是一個具體的問題(「我怎樣才能加快這個代碼?它需要一天的時間」)以及代碼審查請求。 – Zeta
如有必要,我可以刪除此帖子並將其移至代碼複審。 – Josh