这就是我的做法(盲迭代算法,假设不知道,因为当你纯粹对“如何模拟这个”感兴趣时):
simulate.sd <- function(nsim=10, n=200, seed=101, tol=0.01) {
set.seed(seed)
sd.value <- 1
rsquare <- 1:nsim
results <- 1:nsim
for (i in 1:nsim) {
# tracking iteration: if we miss the value, abort at sd.value > 7.
iter <- 0
while (rsquare[i] > (0.20 + tol) | rsquare[i] < (0.2 - tol)) {
sd.value <- sd.value + 0.01
rsquare[i] <- simulate.sd.iter(sd.value, n)
iter <- iter + 1
if (iter > 3000) { break }
}
results[i] <- sd.value # store the current sd.value that is OK!
sd.value <- 1
}
cbind(results, rsquare)
}
simulate.sd.iter <- function(sd.value, n=200) { # helper function
# Takes the sd.value, creates data, and returns the r-squared
X1 <- rnorm(n, 0, 1)
X2 <- rnorm(n, 0, 1)
Y <- rnorm(n, (5 + 3*X1 - 2*X2), sd.value)
simdata <- data.frame(X1, X2, Y)
return(summary(lm(Y ~ X1 + X2, data=simdata))$r.squared)
}
simulate.sd()
需要注意的几点:
- 我让 X1 和 X2 变化,因为这会影响这个寻求
sd.value
的 .
- 容差是您希望这个估计值有多精确。r-squared 为 ~0.19 或 ~0.21 是否合适?公差为 0.01。
- 请注意,过于精确的容差可能无法让您找到结果。
- 1 的值是一个非常糟糕的起始值,使得这个迭代算法非常慢。
10 个结果的结果向量是:
[1] 5.64 5.35 5.46 5.42 5.79 5.39 5.64 5.62 4.70 5.55
,
在我的机器上大约需要 13 秒。
我的下一步将从 4.5 开始,在迭代中添加 0.001 而不是 0.01,并可能降低容差。祝你好运!
好的,nsim=100 的一些汇总统计,耗时 150 秒,步长增加了 0.001,容差仍为 0.01:
Min. 1st Qu. Median Mean 3rd Qu. Max.
4.513 4.913 5.036 5.018 5.157 5.393
你为什么对这个感兴趣?