使用 R 中的分段函数加速分段回归的迭代
Speed up iterations of piecewise regressions with the segmented function in R
我正在尝试使用 R 中 segmented
包中的 segmented
函数拟合大约 300 个分段回归。由于 segmented
功能。我已经在使用我计算机的所有内核,但我不是程序员,我猜这段代码可能不是最优的。我可以改进下面的代码以使其 运行 更快吗?怎么样?
这是一个可重现的例子。 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
退出循环并不会显着提高循环速度。
应该有帮助的一件事是一旦找到结果就打破迭代。在大多数情况下,它应该在第一次迭代时找到一些东西,这将避免 运行 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
}
我正在尝试使用 R 中 segmented
包中的 segmented
函数拟合大约 300 个分段回归。由于 segmented
功能。我已经在使用我计算机的所有内核,但我不是程序员,我猜这段代码可能不是最优的。我可以改进下面的代码以使其 运行 更快吗?怎么样?
这是一个可重现的例子。 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
退出循环并不会显着提高循环速度。
应该有帮助的一件事是一旦找到结果就打破迭代。在大多数情况下,它应该在第一次迭代时找到一些东西,这将避免 运行 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
}