使用R

时间:2018-07-05 05:56:37

标签: r performance linear-regression piecewise

我正在尝试使用R中segmented包中的segmented函数来拟合大约300个分段回归。由于segmented,这花费了很多时间(〜4天)功能。我已经在使用计算机的所有内核,但是我不是程序员,所以我猜这段代码可能不是最佳的。我可以改进下面的代码以使其运行更快吗?怎么样?

这是一个可复制的示例。 df是一个模拟的数据框,对应于我要分析的300个数据集之一。每个数据集都是一天,每天我每5分钟测量一次温度,x是温度,y是一天中的时间。下图显示了我的数据。该模式非常特异,可在几天内重复,并且每个斜率变化都与众所周知的生物学机制相对应。这就是为什么我可以猜出所有psi值的原因(例如日出和日落的时间)。

当然,实际数据的可变性更大,我使用许多次迭代(大约200次,此处示例中减少到10次)来增加成功拟合的机会。

library(segmented)
y<-seq(1,288,1)
x<-c(seq(0,-30,-1),seq(-30,-54,-2),seq(-54,30,1),seq(30,10,-1),seq(10,90,1),seq(90,34,-1))
df<-data.frame(x,y)
head(df)

plot(x~y)
t1=31
t2=44
t3=129
t4=150
t5=231

iterations<-10
for (j in 1:iterations) {           
  res <- lm(formula=x~y,data=df)      
  try(result <- segmented(
       res, seg.Z=~y, psi=c(t1,t2,t3,t4,t5),
       control=seg.control(it.max=200, display=F, K=4, h=0.1, n.boot=100, random=T)))          
}

result

Temperature ~ time of the day

lm移出循环并不会显着提高循环速度。

1 个答案:

答案 0 :(得分:2)

应该帮助的一件事是,一旦找到结果,就中断迭代。在大多数情况下,它应该在第一次迭代中找到一些东西,这将避免运行200次不必要的迭代。

rm(result)
for (j in 1:iterations) {           
  res <- lm(formula=x~y,data=df)
  try(result <- segmented(
       res, seg.Z=~y, psi=c(t1,t2,t3,t4,t5),
       control=seg.control(it.max=200, display=F, K=4, h=0.1, n.boot=100, random=T)))
  if (exists("result")) break
}