rgp(R遗传编程)包 - 不能做回归

时间:2016-12-04 12:14:51

标签: r regression rgp

我正在尝试使用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")

但是,我得到的回归线明显不正确。数据点的分布表示随着压力增加而降低速率的曲线关系(反向关联)。但是,生成的回归线是线性的并且方向错误。

enter image description here

错误在哪里?

编辑:

在评论中使用@ 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分钟。情节是:

enter image description here

回归线的方向优于上述(!),但它表明需要很长时间才能达到明显的方向。由@ cuttlefish44获得的函数的回归线也很相似,并不是很合适。

1 个答案:

答案 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标准的最佳模型。