非线性回归,R语言最全教程
线性回归,大家已经很熟悉了,但是在现实中,很多时候是非线性的。今天我们就在这一起,探讨一下如何在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分析基本教程】
本课程的优势就是来源于临床医生,用之于临床医生,做一套临床医生看得懂的临床科研教程。
扫描二维码——立即获取心动课程!
查看原文 >>