首页 文章

用于循环操作的循环替代方案

提问于
浏览
2

我必须逐步将回归函数应用于时间序列数据(向量“时间”和“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

2 回答

  • 3
    results <- sapply(2:top,function (k) coef(lm(tm[1:k] ~ log(time[1:k])))[2])
    

    〜应用函数族是在R中迭代的最快方法 .

    也可以看一下使用lm.fit()来加快你的注册速度

    cumsum(1:10)
    

    是如何做第二个问题

  • -1

    好吧,没有快速循环替代,除非你可以矢量化 . 在某些情况下,像 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, forlapply 在这里完全一样快 . 诀窍是使用 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]
    )
    

    作为更一般的解决方案 .

相关问题