ベクトル化できない限り、高速ループの代替手段はありません。状況によっては、次のような関数ave, aggregate, ddply, tapply, ...
が実質的な勝利をもたらす可能性がありますが、多くの場合、秘訣は cumsum などのより高速な関数を使用することにあります (user615147 の回答を参照)。
説明する :
top <- 1000
tm <- rnorm(top,10)
time <- rnorm(top,10)
> system.time(
+ results <- sapply(2:top,function (k) coef(lm(tm[1:k] ~ log(time[1:k])))[2])
+ )
user system elapsed
4.26 0.00 4.27
> system.time(
+ results <- lapply(2:top,function (k) coef(lm(tm[1:k] ~ log(time[1:k])))[2])
+ )
user system elapsed
4.25 0.00 4.25
> system.time(
+ results <- for(k in 2:top) coef(lm(tm[1:k] ~ log(time[1:k])))[2]
+ )
user system elapsed
4.25 0.00 4.25
> system.time(
+ results <- for(k in 2:top) lm.fit(matrix(log(time[1:k]),ncol=1),
+ tm[1:k])$coefficients[2]
+ )
user system elapsed
0.43 0.00 0.42
唯一の高速なソリューションはlm.fit()
. 誤解しないでください。解析を実行するたびにタイミングが少し異なるため、R では 0.02 の差は重要ではなく、sapply, for
すべてlapply
正確に高速です。を使うのがコツですlm.fit
。
Data というデータフレームがある場合、次のようなものを使用できます。
Data <- data.frame(Y=rnorm(top),X1=rnorm(top),X2=rnorm(top))
mf <- model.matrix(Y~X1+X2,data=Data)
results <- sapply(2:top, function(k)
lm.fit(mf[1:k,],Data$Y[1:k])$coefficients[2]
)
より一般的な解決策として。