我必须逐步将回归函数应用于时间序列数据(向量“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&lt; -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
答案 0 :(得分:3)
嗯,没有快速循环替代,除非你可以矢量化。在某些情况下,像ave, aggregate, ddply, tapply, ...
这样的函数可以给你带来实质性的胜利,但通常的诀窍在于使用更快的函数,比如cumsum(cfr。用户615147的答案)
举例说明:
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]
)
作为更通用的解决方案。
答案 1 :(得分:-1)
results <- sapply(2:top,function (k) coef(lm(tm[1:k] ~ log(time[1:k])))[2])
〜apply函数系列是在R中迭代的最快方法。
还可以看一下使用lm.fit()来加速你的注册
cumsum(1:10)
是如何做第二个问题