线性回归,大家已经很熟悉了,但是在现实中,很多时候是非线性的。今天我们就在这一起,探讨一下如何在R语言中实现非线性回归。

  首先加载包

  library(tidyverse)

  library(caret)

  data("Boston", package = "MASS")

  # 加载数据

  setset.seed(123)

  training.samples % createDataPartition(p = 0.8, list = FALSE)

  train.data

  test.data

  # 将数据集分为训练集与验证集

  ggplot(train.data, aes(lstat, medv) ) +

  geom_point() +

  stat_smooth()

  首先拟合一个散点图,看看情况。

  我们先来个线性模型

  # 建立模型

  model

  # 模型预测

  predictions % predict(test.data)

  # 评估模型

  data.frame( RMSE = RMSE(predictions, test.data$medv),

  R2 = R2(predictions, test.data$medv))

  ## RMSE R2 ## 1 6.07 0.535

  看看线性拟合的图形

  ggplot(train.data, aes(lstat, medv) ) +

  geom_point() +

  stat_smooth(method = lm, formula = y ~ x)

  多项式回归

  lm(medv ~ poly(lstat, 6, raw = TRUE), data = train.data) %>% summary()

  由上面结果可以看出,再第5次方之后,就失去了统计学意义,所以我们建立5次多项式就可以。

  model

  然后做一下预测

  predictions % predict(test.data)

  data.frame(

  RMSE = RMSE(predictions, test.data$medv),

  R2 = R2(predictions, test.data$medv))

  ## RMSE R2 ## 1 4.96 0.689

  结果提示较线性回归稍微改善。

  画个图,看看拟合情况

  ggplot(train.data, aes(lstat, medv) ) +

  geom_point() +

  stat_smooth(method = lm, formula = y ~ poly(x, 5, raw = TRUE))

  log转换

  有时候在非线性关系下,可以尝试做一些转换,从而使用线性方程进行拟合

  # 构建模型

  

  # 模型预测

  predictions % predict(test.data)

  # 评估模型

  data.frame(

  RMSE = RMSE(predictions, test.data$medv),

  R2 = R2(predictions, test.data$medv))

  ## RMSE R2 ## 1 5.24 0.657

  画个图看看

  ggplot(train.data, aes(lstat, medv) ) +

  geom_point() +

  stat_smooth(method = lm, formula = y ~ log(x))

  样条回归

  library(splines)

  # 建立模型,确定节点

  knots

  model

  # 进行预测

  predictions % predict(test.data)

  #评估模型

  data.frame(

  RMSE = RMSE(predictions, test.data$medv),

  R2 = R2(predictions, test.data$medv))

  ## RMSE R2 ## 1 4.97 0.688

  画个图看看

  ggplot(train.data, aes(lstat, medv) ) +

  geom_point() +

  stat_smooth(method = lm, formula = y ~ splines::bs(x, df = 3))

  广义相加模型

  library(mgcv)

  # 构建模型

  model

  # 进行预测

  predictions % predict(test.data)

  # 评估模型

  data.frame(

  RMSE = RMSE(predictions, test.data$medv),

  R2 = R2(predictions, test.data$medv))

  ## RMSE R2 ## 1 5.02 0.684

  画个图看看

  ggplot(train.data, aes(lstat, medv) ) +

  geom_point() +

  stat_smooth(method = gam, formula = y ~ s(x))

  总之,当发现是非线性关系时,还是有很多方法可以解决的。根据R平方的值,可以看出多项式回归,样条回归,广义相加模型较线性回归要好一些。

  平台推荐课程

  各位粉丝,大家好!经过编辑部的筹备,临床科研设计与方法系列课程陆续在【网易云课堂】登陆,重磅上线!希望各位粉丝能够喜欢~

  【SPSS在临床研究中的应用】

  【Meta分析基本教程】

  本课程的优势就是来源于临床医生,用之于临床医生,做一套临床医生看得懂的临床科研教程。

  扫描二维码——立即获取心动课程!

查看原文 >>
相关文章