渐进式操作的 For 循环替代方案
我必须逐步将回归函数应用于时间序列数据(向量“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 的情况,它会变得非常慢。 有没有更快的替代方案(也许使用 apply 函数)?
在一个更简单的问题中:如果我有一个像 x<-c(1:10) 这样的向量,我如何构建包含(例如)x 值的渐进和的 ay 向量? 喜欢:
x
1 2 3 4 5 6 7 8 9 10
y
1 3 6 10 15 21 28 36 45 55
I have to apply regression function progressively to a time series data (vector "time" and "tm" and I'm using a For Loop as follow:
top<-length(time)
for(k in 2:top){
lin.regr<-lm(tm[1:k] ~ log(time[1:k]))
slope[k]<-coef(lin.regr)[2]
}
But for vectors' length of about 10k it becomes very slow.
Is there a faster alternative (maybe using apply function)?
In a more easy problem: if I have a vector like x<-c(1:10) how can I build a y vector containing (for example) the progressive sum of x values?
Like:
x
1 2 3 4 5 6 7 8 9 10
y
1 3 6 10 15 21 28 36 45 55
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
嗯,没有快速循环替代方案,除非您可以矢量化。在某些情况下,诸如ave、aggregate、ddply、tapply...之类的函数可以为您带来巨大的胜利,但通常诀窍在于使用更快的函数,例如cumsum(参见user615147的答案)
举例来说:
唯一更快的解决方案是
lm.fit()
。不要误会,每次运行分析时的时间都会有所不同,因此 0.02 的差异在 R 中并不显着。sapply、for
和lapply
都是在这里同样快。诀窍是使用lm.fit
。如果您有一个名为 Data 的数据框,您可以使用类似 :
作为更通用的解决方案。
Well, there is no fast loop alternative, unless you can vectorize. In some circumstances functions like
ave, aggregate, ddply, tapply, ...
can give you a substantial win, but often the trick lies in using faster functions, like cumsum (cfr. the answer of user615147)To illustrate :
The only faster solution is
lm.fit()
. Don't be mistaken, the timings differ a bit every time you run the analysis, so a difference of 0.02 is not significant in R.sapply, for
andlapply
are all exactly as fast here. The trick is to uselm.fit
.If you have a dataframe called Data, you could use something like :
as a more general solution.
〜应用函数系列是在 R 中迭代的最快方法。
还可以看看使用 lm.fit() 来加快你的回归速度,
第二个问题是如何做的
~apply family of functions is the fastest way to iterate in R.
can also look at using lm.fit() to speed up your regrssion a bit
is how to do the second question