我正在尝试使用R遗传包(rgp)进行非线性回归,使用此处使用的技术:Fitting a curve to specific data(参见第二种方法)。我正在使用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获得的函数的回归线也很相似,并不是很合适。
答案 0 :(得分:-1)
你可能已经读过这个,但我认为你的答案隐藏在Oliver Flasch写的this introduction to RGP package里面。
我对rgp
软件包一无所知,但如果您只想进行线性回归,为什么不使用基础软件包中的lm()
函数?
至少你能够估计普通最小二乘回归的β 0 和β 1 的参数:
rate =β 1 * pressure +β 0
linear.model <- lm(rate ~ pressure, data=heartrate)
ggplot(data=heartrate, aes(x=pressure,y=rate)) +
geom_point() +
geom_smooth(method="lm", col="red")
linear regression with ggplot2
您可以使用linear.model$coefficients
您仍然可以使用linear.model$fitted.values
您可以使用linear.model$residuals
如果您想要更准确地拟合曲线,线性模型可能不够,您可以尝试glm
或多项式回归并选择具有AIC或BIC标准的最佳模型。