r中的高斯平滑器
gaussian smoother in r
我正在使用 ggplot 绘制以下数据,并且我正在尝试拟合一个平滑器来捕捉曲线的类高斯性质。我已经尝试过标准的黄土和样条平滑器,但它们会导致前线出现巨大的下降,而这并不存在(我尝试附上 stat_smooth() 结果的图像,但我没有 10 声望点,因为我是 Whosebug 的新手)。
我现在试图通过创建一个高斯形状的公式 (MyFormula) 并在 stat_smooth 函数中使用它来强制使高斯更平滑,但我收到以下错误,我认为这是正在发生的因为 MyFormula 方程没有被 FrontBack 分隔:
"Error in model.frame.default(formula = C$mean_Dye ~ max(C$mean_Dye) + :
variable lengths differ (found for 'max(C$mean_Dye)')"
是否有更简单的方法可以使前线和后线的数据更平滑地拟合高斯形(或任何其他代表)?
MyFormula=C$mean_Dye~max(C$mean_Dye)*exp(-0.5*((C$Meters-mean(C$Meters))/sd(C$Meters))^2)
ggplot(C, aes(x=Meters, y=mean_Dye, color=FrontBack)) + geom_point(pch=19, size = 6, alpha=1/4) + geom_errorbar(aes(ymin=mean_Dye-seDye, ymax=mean_Dye+seDye), width=0.1) + coord_cartesian(ylim=c(-100,100), xlim=c(16,50)) + stat_smooth(method="gam", formula=MyFormula, group=C$FrontBack, se=F)
Meters mean_Dye seDye FrontBack
17.0 -0.005 0.05 Front
29.0 0.036 0.05 Front
31.5 50.78 14.3 Front
32.5 69.82 8.04 Front
33.0 58.53 5.72 Front
33.5 50.93 5.29 Front
34.5 43.15 3.70 Front
37.0 15.51 4.02 Front
49.0 0.069 0.03 Front
17.0 0.111 0.023 Back
23.0 1.92 0.278 Back
26.0 5.98 0.743 Back
28.0 12.13 1.186 Back
30.0 18.99 1.419 Back
31.0 19.04 0.916 Back
32.0 18.17 1.416 Back
33.0 16.51 2.143 Back
34.0 13.99 2.178 Back
35.0 11.85 2.136 Back
36.0 6.63 1.751 Back
38.0 0.97 0.689 Back
40.0 0.099 0.116 Back
43.0 0.004 0.039 Back
49.0 0.041 0.040 Back
在之前 post 中找到答案 - 效果很好。
f<-function(x, theta) {
m<-theta[1]; s<-theta[2]; a<-theta[3]; b<-theta[4];
a*exp(-0.5*((x-m)/s)^2) + b
}
fit<-nls(y~f(x,c(m,s,a,b)), data.frame(x,y), start=list(m=12, s=5, a=12, b=-2))
我正在使用 ggplot 绘制以下数据,并且我正在尝试拟合一个平滑器来捕捉曲线的类高斯性质。我已经尝试过标准的黄土和样条平滑器,但它们会导致前线出现巨大的下降,而这并不存在(我尝试附上 stat_smooth() 结果的图像,但我没有 10 声望点,因为我是 Whosebug 的新手)。
我现在试图通过创建一个高斯形状的公式 (MyFormula) 并在 stat_smooth 函数中使用它来强制使高斯更平滑,但我收到以下错误,我认为这是正在发生的因为 MyFormula 方程没有被 FrontBack 分隔:
"Error in model.frame.default(formula = C$mean_Dye ~ max(C$mean_Dye) + : variable lengths differ (found for 'max(C$mean_Dye)')"
是否有更简单的方法可以使前线和后线的数据更平滑地拟合高斯形(或任何其他代表)?
MyFormula=C$mean_Dye~max(C$mean_Dye)*exp(-0.5*((C$Meters-mean(C$Meters))/sd(C$Meters))^2)
ggplot(C, aes(x=Meters, y=mean_Dye, color=FrontBack)) + geom_point(pch=19, size = 6, alpha=1/4) + geom_errorbar(aes(ymin=mean_Dye-seDye, ymax=mean_Dye+seDye), width=0.1) + coord_cartesian(ylim=c(-100,100), xlim=c(16,50)) + stat_smooth(method="gam", formula=MyFormula, group=C$FrontBack, se=F)
Meters mean_Dye seDye FrontBack
17.0 -0.005 0.05 Front
29.0 0.036 0.05 Front
31.5 50.78 14.3 Front
32.5 69.82 8.04 Front
33.0 58.53 5.72 Front
33.5 50.93 5.29 Front
34.5 43.15 3.70 Front
37.0 15.51 4.02 Front
49.0 0.069 0.03 Front
17.0 0.111 0.023 Back
23.0 1.92 0.278 Back
26.0 5.98 0.743 Back
28.0 12.13 1.186 Back
30.0 18.99 1.419 Back
31.0 19.04 0.916 Back
32.0 18.17 1.416 Back
33.0 16.51 2.143 Back
34.0 13.99 2.178 Back
35.0 11.85 2.136 Back
36.0 6.63 1.751 Back
38.0 0.97 0.689 Back
40.0 0.099 0.116 Back
43.0 0.004 0.039 Back
49.0 0.041 0.040 Back
在之前 post 中找到答案 - 效果很好。
f<-function(x, theta) {
m<-theta[1]; s<-theta[2]; a<-theta[3]; b<-theta[4];
a*exp(-0.5*((x-m)/s)^2) + b
}
fit<-nls(y~f(x,c(m,s,a,b)), data.frame(x,y), start=list(m=12, s=5, a=12, b=-2))