答疑贴2:R语言线性和非线性拟合
Posted 小怪兽的R学社
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了答疑贴2:R语言线性和非线性拟合相关的知识,希望对你有一定的参考价值。
· 问题的回复是按照小伙伴们私信时间逐一进行答复的,没有等到自己问题回复的小伙伴不要着急;
· 各位小伙伴请尽量详细的描述自己的问题,这样博主才能有效的解决各位的问题;
· 博主自知学识浅薄,回复各位小伙伴的问题也都是根据自己的理解以及查阅资料整理而来的,若有不足之处,烦请留言指正;
首先非常抱歉没有帮这位小伙伴查到如何使用ggplot2拟合指数曲线,为了尽可能帮助到他,博主结合以前数据分析的经验用另一种方式实现了指数曲线的拟合。但是为了能为大家呈现更多相关的内容,博主就拟合模型选择、图像绘制以及相关参数标注的问题进行介绍。
如果有小伙伴知道如何使用ggplot2拟合指数曲线,还请不吝赐教
首先我们得知道常用的函数类型有哪些,这样在绘制出散点图后,我们才能大概猜测散点的走势。
在某一个变化过程中,设有两个变量x和y,如果可以写成y=kx+b(k为一次项系数,k≠0,b为常数),那么我们就说y是x的一次函数,其中x是自变量,y是因变量。
在数学中,二次函数最高次必须为二次,二次函数(quadratic function)的基本表示形式为y=ax²+bx+c。二次函数的图像是一条对称轴平行或重合于y轴的抛物线. 二次函数表达式y=ax²+bx+c的定义是一个二次多项式。
一般地,形如y=a^x(a>0且a≠1) (x∈R)的函数叫做指数函数。也就是说以指数为自变量,幂为因变量,底数为常量的函数称为指数函数,它是初等函数中的一种.可以扩展定义为R。
一般地,对数函数是以幂(真数)为自变量,指数为因变量,底数为常量的函数。
一般地,形如y=x^a(a为常数)的函数,即以底数为自变量,幂为因变量,指数为常量的函数称为幂函数.例如函数y=x^0 y=x^1、y=x^2、y=x^(-1)等都是幂函数。其实一次函数和二次函数也是特殊的幂函数。
在初步了解各种函数的图形之后,我们根据自己的数据绘制散点图,就能大概了解该数据符合那种函数。接下来就是优选模型。
ggplot2的确可以计算各种函数分布,并可视化,但geom_smooth( )中的expression()命令想要输出公式,你需要熟悉公式的书写方法,如下图:
实在让人头大,因此给大家安利一个R包:basicTrendline,此包的优秀之处在于它可以一次性生成散点图的拟合曲线、拟合方程、判别系数R^2和P值。
install.packages("basicTrendline")
library(basicTrendline)
#生成数据
x = c(3.6,4.6,4.7,5.7,6.6,7.5,8.3,9.4,10.1,11.12,13.9,13.5,14.2,13.7,15.6)
y = c(11,11,12,13,14,15,16,17,18,19,20,21,22,23,25)
#绘制散点图plot(x,y)
这个包的优势在于你可以使用通用的函数“trendline”建立不同的函数,只需要改变参数model的值。参数“model”的值可以为“line2P”,“line3P”,“log2P”,“exp2P”,“exp3P” ,“power2P” ,“power3P”。
添加趋势线
一次函数:y=a*x+b
trendline(x, y, model="line2P", ePos.x = "topleft", summary=TRUE, eDigit=5)
二次函数:y=a*x^2+b*x+c
trendline(x, y, model="line3P", ePos.x = "topleft", summary=TRUE, eDigit=5)
对数函数:y=a*ln(x)+b
trendline(x, y, model="log2P", ePos.x = "topleft", summary=TRUE, eDigit=5)
指数函数:y=a*exp(b*x)
trendline(x, y, model="exp2P", ePos.x = "topleft", summary=TRUE, eDigit=5)
指数函数:y=a*exp(b*x)+c
trendline(x, y, model="exp3P", ePos.x = "topleft", summary=TRUE, eDigit=5)
幂函数:y=a*x^b
trendline(x, y, model="power2P", ePos.x = "topleft", summary=TRUE, eDigit=5)
幂函数:y=a*x^b+c
trendline(x, y, model="power3P", ePos.x = "topleft", summary=TRUE, eDigit=5)
根据判别系数就可以知道我们的数据更符合那种函数分布。
basicTrendline是一个非常友好的包,他不仅可以提供拟合曲线必须的拟合值,还能通过改变trendline()中不同的命令来实现拟合曲线以及置信区间的颜色和线形的变化,详细内容请参考basicTrendline包的使用说明(https://cran.rproject.org/web/packages/basicTrendline/index.html)。
ggplot2的确在数据可视化方面有巨大的优势,但是如果自身能力有限无法通过ggplot2绘制自己想要的图形,那就需要R语言中其他的包来实现。有些小伙伴喜欢用代码将拟合曲线的拟合值和P值都显示在图中,但整个图片字体等信息的调整还是需要借助PS和PPT等软件,尤其是PPT对R语言输出metafile格式图片的修改非常方便。具体的R语言图片导出和PPT中图片的修改请参考博主的博文
新鲜出炉 的主成分图来啦 薛定谔的猫,公众号:小怪兽的R学社
扫码关注
更多精彩
以上是关于答疑贴2:R语言线性和非线性拟合的主要内容,如果未能解决你的问题,请参考以下文章
R语言构建xgboost模型:使用xgboost构建广义线性模型(GLM):使用gblinear算法拟合线性模型并配置L1和L2正则化
R语言使用lm函数拟合回归模型(简单线性回归一元回归simple regression)并解读拟合模型