【发布时间】:2018-07-05 05:56:37
【问题描述】:
我正在尝试使用 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 退出循环并不会显着提高循环速度。
【问题讨论】:
-
你能举例说明你的数据吗? t1, ..., t5 是什么?
-
300 个分段回归,每个回归有 5 个断点?对于您要解决的任何统计问题,我严重怀疑这是否是一种明智的方法。如果您的数据确实遵循具有 5 个断点的线性关系,您可能可以通过提供更好的起始值来加快速度。然而,情况可能并非如此,因为这在现实世界的数据中极为罕见。
-
您可以使用
lm.fit()而不是lm,它提供的输出不太完整,但速度更快,您可以只提取您需要的内容。 -
三个问题:1.你有没有profile你的代码;
lm或segmented是否占用了大部分时间? 2.你说的并行是在哪里做的? 3.你能把res <- lm(formula=x~y,data=df)移出循环吗? -
这里的迭代到底是什么?据我所知,您在 for 循环中运行了 10 次
segmented尝试,但不依赖于分段函数中的先前结果。如果是这种情况,那么一个简单的mclapply和library(parallel)而不是 for 循环应该会显着加快你的速度。
标签: r performance linear-regression piecewise