To w jaki sposób to zrobić (ślepego iteracyjny algorytm, zakładając, że nie wiedzą, bo kiedy jesteś czysto zainteresowany „jak symulować to”):
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()
kilka rzeczy do uwaga:
- Pozwoliłem, aby X1 i X2 były różne, ponieważ wpływa to na szukaną
sd.value
.
- Tolerancja określa dokładność tego oszacowania. Wszystko dobrze z r-kwadratem ~ 0,19 lub ~ 0,21? Czy tolerancja wynosi 0,01.
- Należy pamiętać, że zbyt precyzyjna tolerancja może uniemożliwić znalezienie wyniku.
- Wartość 1 jest dość złą wartością początkową, dzięki czemu ten iteracyjny algorytm jest dość powolny.
Otrzymany wektor 10 wyników jest:
[1] 5.64 5.35 5.46 5.42 5.79 5.39 5.64 5.62 4.70 5.55
,
które trwa około 13 sekund w moim maszyny.
Mój następny krok to zacząć od 4,5, dodać 0,001 do iteracji zamiast 0,01 i być może obniżyć tolerancję. Powodzenia!
porządku, niektóre statystyki podsumowujące dla nsim = 100, biorąc 150 sekund z etapów wzrostu 0.001 i tolerancji jeszcze na 0,01:
Min. 1st Qu. Median Mean 3rd Qu. Max.
4.513 4.913 5.036 5.018 5.157 5.393
Dlaczego jesteś zainteresowany to chociaż?
bardzo cenione. W następującym zmodyfikowanym scenariuszu, jaki byłby wzór na wariancję Y? n <- 100000; C1 <- rnorm (n, 0, 1); C2 <- rnorm (n, 0, 1); X <- rnorm (n, (3 * C1 - 2 * C2), 1); Y <- rnorm (n, (2 * C1 + 8 * C2 + 2 * X), 1) – Slyron