1

我正在尝试使用此处使用的技术使用 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 获得的函数的回归线也相似,但不是很合适。

4

1 回答 1

-1

您可能已经阅读过这篇文章,但我认为您的答案隐藏在Oliver Flasch 编写的RGP 包介绍中的某个地方。

我对包一无所知,rgp但是如果您只想要线性回归,为什么不使用lm()基本包中的函数?

至少您可以估计普通最小二乘回归的 β 0和 β 1参数:

速率 = β 1 * 压力 + β 0

     linear.model <- lm(rate ~ pressure, data=heartrate)

     ggplot(data=heartrate, aes(x=pressure,y=rate)) + 
         geom_point() + 
         geom_smooth(method="lm", col="red")

ggplot2的线性回归

您可以通过以下方式访问系数linear.model$coefficients

您仍然可以使用linear.model$fitted.values

您可以通过以下方式访问残差:linear.model$residuals

如果您想更准确地拟合曲线,线性模型可能不够用,您可以尝试glm或多项式回归并选择具有 AIC 或 BIC 标准的最佳模型。

于 2016-12-04T13:05:57.640 回答