y[t] = y[t-1] + epsilon[t]
に関連する投稿コードは実際の動作コードではありませんが、1000 * 2のランダムウォークをすべて保存しようとしています。実際にこれを行う必要はありません。私たちはランダムウォークの実現が何であるかではなく、t-スコアだけを気にします。
このような問題では、プロシージャを何度も複製することを目指しているため、このようなプロシージャを一度に実行する関数を最初に記述すると便利です。あなたはすでにこれのために良い作業コードを持っていました。私たちは機能(plot
のようなものを不要な部分を削除)でラップする必要があります。
sim <- function() {
y <- cumsum(rnorm(100,0,1))
x <- cumsum(rnorm(100,0,1))
coef(summary(lm(y ~ x)))[2,3]
}
この関数には、入力を取りません。 1回の実験ではtスコアのみを返します。
ここでは、これを1000回繰り返します。これはlm
とsummary.lm
の両方があるので、それは、このような単純なタスクのためにあるべきよりもはるかに遅い、しばらく時間がかかります注
S <- replicate(1000, sim())
(必要に応じて
?replicate
を読んで)私たちは、
for
ループを書くことができますが、機能
replicate
は簡単ですスロー。もっと速い方法が後で表示されます。
今、S
は1000個の値を持つベクトルで、「1000 t検定のシーケンス」です。 を取得するには、「時間の数1,000 t検定の絶対値が> 1.96」、私たちは、結果756は私が得るだけのものです
sum(abs(S) > 1.96)
# [1] 756
使用することができます。シミュレーションがランダムなので、あなたは何か違うものを得るでしょう。しかし、それはいつも予想どおりかなり大きな数字になるでしょう。
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
}
この関数はsummary.lm
ことなく、単純な線形回帰lm
せず、そしてT-スコアを計算します。
S <- replicate(1000, fast_sim())
sum(abs(S) > 1.96)
# [1] 778
別の方法はcor.test
を使用することです:
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
のベンチマークを持ってみましょう:
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
はlm
+ summary.lm
よりもはるかに高速ですが、手動計算はさらに高速です!
速い返信ありがとうございます。しかし、もし私がしたら、 sim < - function(){ y < - cumsum(rnorm(100,0,1)) x < - cumsum(rnorm(100,0,1)) coef [2,3] } S < - replicate(1000、sim()) 1000の異なるものではなく同じtの値を返すだけではありませんか? – Rprogrammer
ありがとうZheyuan Li!それは完全に動作します... – Rprogrammer