我正在尝试使用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
将lm
移出循环并不会显着提高循环速度。
答案 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
}