我正在尝试使用此处使用的技术使用 R 遗传包(rgp)进行非线性回归:将曲线拟合到特定数据(参见第二种方法)。我正在使用 R 包drc
获取heartrate
数据:
library(drc)
head(heartrate)
# pressure rate
#1 50.85 348.76
#2 54.92 344.45
#3 59.23 343.05
#4 61.91 332.92
#5 65.22 315.31
#6 67.79 313.50
library(rgp)
res <- symbolicRegression(rate ~ pressure, data=heartrate)
(symbreg <- res$population[[which.min(sapply(res$population, res$fitnessFunction))]])
#function (pressure)
#pressure + (pressure/0.853106872646055 + pressure)
ggplot() +
geom_point(data=heartrate, aes(pressure,rate), size = 3) +
geom_line(data=data.frame(symbx=heartrate$pressure,
symby=sapply(heartrate$pressure, symbreg)),
aes(symbx, symby), colour = "red")
但是,我得到的回归线显然是不正确的。数据点的分布表明随着压力的增加与速率降低呈曲线关系(反向关联)。但是,生成的回归线是线性的并且方向错误。
错误在哪里?
编辑:
使用@cuttlefish44 在评论中建议的增加步骤:
res = symbolicRegression(rate ~ pressure, data = heartrate, stopCondition = makeStepsStopCondition(45000))
(symbreg <- res$population[[which.min(sapply(res$population, res$fitnessFunction))]])
#function (pressure)
#exp(exp(exp(cos(cos(-9.23878724686801/pressure)))))
花了8分钟才完成。情节是:
回归线的方向比上面的好(!),但它表明需要很长时间才能到达明显的方向。与@cuttlefish44 获得的函数的回归线也相似,但不是很合适。