对数据的拟合(回归分析)是常见的分析需求,可以更直观地反应数据的变化趋势,并对数据进行评价。(虽然这个东西excel其实也可以很简答地搞定,但是可视化和文章Methods阐述方面还是R/python或者其他语言更胜一筹)
R里面基本函数都是一样的:y~lm(x),同样非常简单
1. 线性回归
线性回归问题求解拟合方程:(举例如下)
x=c(9,13,20,30,41,54,67,86)
y=c(53,59,60,81,93,112,130,160)
model=lm(y~x)
# 查看拟合方程系数(例如这里是y=37.80+1.39x)
model$coefficients
# R值
summary(model)$r.squared
summary(model)$adj.r.squared
# p值
f <- summary(model)$fstatistic
pf(f[1], f[2], f[3], lower.tail=F)
# y-y^ 即参差
model$residuals
# predict()预测新的值(虽然但是 必须以dataframe/list的方式输入)
predict(model, data.frame(x=c(0, 1, 2)))
# 可视化(这里比较简单 建议用ggplot2美化)
plot(x,y)
abline(model,col='red') # 或者abline(a=截距,b=斜率,col=颜色)
PS,上面这个lm()也是支持多元线性回归的,例如y~lm(x1+x2+x3)
。
2.非线性拟合
常规方法,可以把自变量调整(例如x^2变成x,变成线性),或者直接丢给R, R是做多项式拟合:
可是化主要依托于 ggplot2 的 geom_smooth() 函数。
# 只要求解 访问基本和上面一样 不再赘述
model=lm(y〜poly(x,n))# n是多项式的最高次数,可以按拟合效果自己选择
formula <- y ~ poly(x, 6, raw = TRUE)
# ggplot2 可视化
library(ggplot2)
ggplot(data, aes(x=x,y=y)) +
geom_point() + theme_bw() +
geom_smooth(method = "lm", formula = formula)+
stat_poly_eq( # 注释方程 不想要 就去掉这部分
aes(label = paste(..eq.label.., ..adj.rr.label.., sep = "~~~~")),
formula = formula, parse = TRUE
)
扩展,如果是想在一张图里面画多个数据,需要先把宽数据转长数据,然后微调参数,操作如下:
library(reshape2)
data2<- melt(data, id='classification')
formula <- y ~ poly(x, 6, raw = TRUE)
ggplot(data, aes(x, y, color = variable))+theme_bw()+
geom_smooth(aes(fill = variable), method = "lm", formula = formula)
3.广义线性回归模型(Generalized Linear Model)
如果有目的活着期望的分布模型,那么可以借助R里面的glm()函数。
glm(formula, family = gaussian, data, weights, subset,na.action, start = NULL, etastart, mustart, offset,control = list(...), model = TRUE, method = "glm.fit",x = FALSE, y = TRUE, contrasts = NULL, ...)
其中,
formula
为拟合公式,与函数lm()中的参数formula用法相同;
family
用于指定分布族,包括正态分布(gaussian)、二项分布(binomial)、泊松分布(poisson)和伪伽马分布(Gamma),以及逻辑回归等;分布族还可以通过选项link来指定连接函数,默认值为family=gaussian (link=identity),二项分布默认值为family=binomial(link=logit);
data
指定数据集;
offset
指定线性函数的常数部分,通常反映已知信息;
control
用于对待估参数的范围进行设置。
例如:https://www.cnblogs.com/runner-ljt/p/4574275.html