如何在ggplot散点图中添加带置信区间的幂函数拟合曲线
可行实现方案
你可以通过以下两种方法替换原有geom_smooth的loess拟合,实现带置信区间的幂函数回归:
方案1:对数转换线性拟合(实现最简单)
对幂函数y=a*x^b两边取自然对数可得ln(y) = ln(a) + b*ln(x),本质为线性回归,geom_smooth可直接支持,置信区间自动计算:
p2<-ggplot(Data,aes(x=Diameter,y=Wet_weight,colour=Site))+ geom_point(size=3.5,alpha=0.3)+ # 替换原有loess拟合行 geom_smooth(aes(group=Species), method = "glm", formula = y ~ log(x), family = gaussian(link = "log"), colour = "black", se = TRUE)+ labs(x="\nUmbrella diamter (mm)",y="Wet weight (mg)\n")+theme_classic()+ scale_colour_manual(values=c("black","dark blue","blue","dark green","green"))+ theme(axis.title.x=element_text(size=20), axis.text.x=element_text(size=18,colour="black"), axis.title.y=element_text(size=20), axis.text.y=element_text(size=18,colour="black"), axis.ticks=element_line(colour="black",size=1), axis.line=element_line(colour="black",size=1,linetype="solid"), legend.position=c(0.18,0.75), legend.text=element_text(colour="black",size=17), legend.title=element_text(colour="black",size=18)) p2
注意:如果你的数据中直径或湿重存在0值,对数转换会报错,推荐使用方案2
方案2:非线性最小二乘(nls)直接拟合幂函数
直接基于原始模型y=a*x^b做非线性拟合,无需对数转换,更贴合你的模型假设:
# 仅需替换原有代码中的geom_smooth部分即可 geom_smooth(aes(group=Species), method = "nls", formula = y ~ a * x^b, method.args = list(start = c(a = 1, b = 2)), # a和b的初始值可根据你的数据实际范围调整 se = TRUE, colour = "black")
参数说明:start为拟合的初始参数值,若拟合报错可调整a、b的初始值,比如先手动估算下你的数据中x=1时y的大概值作为a的初始值
内容的提问来源于stack exchange,提问作者OceanSun3
相关产品推荐
相关产品推荐

