2

回帰関数を時系列データ (ベクトル "time" と "tm") に徐々に適用する必要があり、次のように For ループを使用しています。

top<-length(time)
for(k in 2:top){
    lin.regr<-lm(tm[1:k] ~ log(time[1:k]))
    slope[k]<-coef(lin.regr)[2]
}

しかし、ベクトルの長さが約 10k の場合、非常に遅くなります。より高速な代替手段はありますか (適用機能を使用する可能性があります)?

より簡単な問題: x<-c(1:10) のようなベクトルがある場合、(たとえば) x 値の累進和を含む y ベクトルを作成するにはどうすればよいでしょうか? お気に入り:

x
1 2 3 4 5 6 7 8 9 10
y
1  3  6 10 15 21 28 36 45 55
4

2 に答える 2

3

ベクトル化できない限り、高速ループの代替手段はありません。状況によっては、次のような関数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]
)

より一般的な解決策として。

于 2011-02-24T17:17:43.540 に答える
-1
results <- sapply(2:top,function (k) coef(lm(tm[1:k] ~ log(time[1:k])))[2])

〜関数のファミリーを適用することは、Rで反復するための最速の方法です。

lm.fit()を使用して、回帰を少し高速化することもできます。

cumsum(1:10)

2番目の質問をする方法です

于 2011-02-24T16:08:31.137 に答える