因为亮度是具有独立随机误差的响应,并且根据高斯函数预计会随着与最佳点的距离而逐渐减小,所以快速非线性回归应该做得很好。
模型是
y=b+aexp(−12(x−ms)2)+ε
在哪里ε表示测量亮度的误差,这里建模为随机量。峰值出现在m;s>0量化曲线逐渐变细的速率;a>0反映相对的整体大小y价值观,以及b是基线。
让我们用示例数据(使用R)来尝试一下。通过包括中间 (m) 在这些参数中,软件会自动输出它的估计值和一个标准误差:
y <- c(-190279, -191971, -108325, 65298, 292274, 292274, 81548, -104653, -136166)/9
x <- (-4:4)*10
#
# Define a Gaussian function (of four parameters).
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
}
#
# Estimate some starting values.
m.0 <- x[which.max(y)]; s.0 <- (max(x)-min(x))/4; b.0 <- min(y); a.0 <- (max(y)-min(y))
#
# Do the fit. (It takes no time at all.)
fit <- nls(y ~ f(x,c(m,s,a,b)), data.frame(x,y), start=list(m=m.0, s=s.0, a=a.0, b=b.0))
#
# Display the estimated location of the peak and its SE.
summary(fit)$parameters["m", 1:2]
非线性拟合的棘手部分通常是为参数找到好的起始值:此代码显示了一种(粗略的)方法。它的输出,
Estimate Std. Error
5.3161940 0.4303487
给出峰值的估计值 (5.32) 及其标准误 (0.43)。绘制拟合并将其与数据进行比较总是一个好主意:
par(mfrow=c(1,1))
plot(c(x,0),c(y,f(coef(fit)["m"],coef(fit))), main="Data", type="n",
xlab="x", ylab="Brightness")
curve(f(x, coef(fit)), add=TRUE, col="Red", lwd=2)
points(x,y, pch=19)

这正是我们所期望的:数据似乎非常适合高斯分布。为了更深入地了解拟合,绘制残差:
plot(x, resid(fit), main="Residuals")

您想检查大多数残差是否与亮度测量中的(已知?)变化一样小,并且其中没有重要的趋势或模式。我们可能有点担心高残差x=40,但在删除最后一个数据点的情况下重新运行该过程不会明显改变m(现在是5.25标准误为0.17,与之前的估计没有区别)。新的残差上下反弹,随着x变大,但在其他方面往往小于1000绝对值左右:这里没有迹象表明需要更多的努力来确定m.