Ihr geposteter Code bezogen auf y[t] = y[t-1] + epsilon[t]
ist nicht wirklich funktionierender Code, aber ich kann sehen, dass Sie versuchen, alle 1000 * 2 Random Walk zu speichern. Eigentlich ist das nicht nötig. Wir kümmern uns nur um den T-Score und nicht darum, was diese Realisierungen von Random Walk sind.
Für diese Art von Problem, bei dem wir versuchen, eine Prozedur viele Male zu replizieren, ist es praktisch, zuerst eine Funktion zu schreiben, um eine solche Prozedur einmal auszuführen. Sie hatten bereits einen guten Arbeitscode dafür; wir müssen es nur in einer Funktion wickeln (diesen unnötigen Teil wie plot
entfernen):
sim <- function() {
y <- cumsum(rnorm(100,0,1))
x <- cumsum(rnorm(100,0,1))
coef(summary(lm(y ~ x)))[2,3]
}
Diese Funktion keine Eingabe erfolgt; Es gibt nur den T-Wert für ein Experiment zurück.
Jetzt werden wir das 1000 Mal wiederholen. Wir können eine for
Schleife schreiben, aber Funktion replicate
ist einfacher (lesen ?replicate
wenn nötig)
S <- replicate(1000, sim())
Hinweis: Das wird einige Zeit dauern, viel langsamer, als es für eine so einfache Aufgabe sein sollte, weil beide lm
und summary.lm
sind langsam. Ein viel schnellerer Weg wird später gezeigt.
Jetzt ist S
Vektor mit 1000 Werten, das ist die "eine Folge von 1000 t-Tests" Sie wollen. Um „die Anzahl der Zeit der absolute Wert der 1000 t-Tests> 1,96“, können wir verwenden nur
sum(abs(S) > 1.96)
# [1] 756
Das Ergebnis 756 ist genau das, was ich bekommen; Sie werden etwas anderes bekommen, da die Simulation zufällig ist. Aber es wird immer eine ziemlich große Anzahl sein, wie erwartet.
Eine schnellere Version von sim
:
fast_sim <- function() {
y <- cumsum(rnorm(100,0,1))
x <- cumsum(rnorm(100,0,1))
y <- y - mean(y)
x <- x - mean(x)
xty <- crossprod(x,y)[1]
xtx <- crossprod(x)[1]
b <- xty/xtx
sigma <- sqrt(sum((y - x * b)^2)/98)
b * sqrt(xtx) * sigma
}
Diese Funktion berechnet einfache lineare Regression ohne lm
, und T-Score ohne summary.lm
.
S <- replicate(1000, fast_sim())
sum(abs(S) > 1.96)
# [1] 778
Eine alternative Möglichkeit ist cor.test
zu verwenden:
fast_sim2 <- function() {
y <- cumsum(rnorm(100,0,1))
x <- cumsum(rnorm(100,0,1))
unname(cor.test(x, y)[[1]])
}
S <- replicate(1000, fast_sim())
sum(abs(S) > 1.96)
# [1] 775
ist eine Benchmark Let haben:
system.time(replicate(1000, sim()))
# user system elapsed
# 1.860 0.004 1.867
system.time(replicate(1000, fast_sim()))
# user system elapsed
# 0.088 0.000 0.090
system.time(replicate(1000, fast_sim2()))
# user system elapsed
# 0.308 0.004 0.312
cor.test
ist viel schneller als lm
+ summary.lm
, aber manuelle Berechnung ist noch schneller!
Danke für die schnelle Antwort. Wenn ich aber einfach sim <- function() { y <- cumsum (rnorm (100,0,1)) x <- cumsum (rnorm (100,0,1)) coef (Zusammenfassung (lm (y ~ x))) [2,3] } S <- replizieren (1000, sim()) Gibt es nicht einfach die gleichen t-Werte zurück als tausend verschiedene? – Rprogrammer
Danke Zheyuan Li! Es funktioniert perfekt ... – Rprogrammer