拟合曲线的可靠性?


11

我想估计拟合曲线的不确定性或可靠性。由于我不知道它的确切含义,因此我故意不指定要查找的精确数学量。

这里,Ë(能量)是因变量(响应),V(体积)是自变量。我想找到某种材料的能量-体积曲线ËV。因此,我使用量子化学计算机程序进行了一些计算,以获取某些样品体积(图中的绿色圆圈)的能量。

然后,我用Birch–Murnaghan函数拟合这些数据样本: 这取决于四个参数: ë 0V 00' 0。我还假定这是正确的拟合函数,因此所有误差仅来自样本的噪声。在下文中,拟合函数ē将被写成函数 V

E(E|V)=E0+9V0B016{[(V0V)231]3B0+[(V0V)231]2[64(V0V)23]},
E0,V0,B0,B0(E^)V

在这里,您可以看到结果(使用最小二乘算法进行拟合)。y轴变量是和x轴变量是V。蓝线是拟合点,绿色圆圈是采样点。EV

样品(绿色)的桦木-穆尔纳汉拟合(蓝色)

我现在需要(在体积的依赖性充其量)这个拟合曲线的可靠性一定程度ÈV ,因为我需要它来计算像过渡压力或焓进一步的数量。E^(V

我的直觉告诉我,拟合曲线在中间是最可靠的,所以我猜想不确定性(例如不确定性范围)应该在样本数据的末尾增加,就像这个草图所示: 在此处输入图片说明

但是,我正在寻找什么样的量度,如何计算呢?

准确地说,这里实际上只有一个错误源:由于计算限制,计算出的样本有噪声。因此,如果我要计算一组密集的数据样本,它们将形成颠簸的曲线。

我想要找到所需不确定度估计值的想法是,在学校学习时根据参数计算以下“误差”(不确定性的传播):

Δë0ΔV0Δ0Δ'0,由拟合软件给出。

ΔËV=ËVË0ΔË02+ËVV0ΔV02+ËV0Δ02+ËV0Δ02
ΔË0ΔV0Δ0Δ0

这是可以接受的方法还是我做错了?

PS:我知道我也可以将数据样本和曲线之间的残差平方求和,以获得某种“标准误差”,但这与体积无关。


您的参数都不是指数,这很好。您使用了哪个NLS软件?大多数将返回对参数不确定性的估计(如果您的参数是指数,则可能是完全不现实的,但事实并非如此)。
DeltaIV '16

等式的右边没有A,但它出现在绘图中。当您说“四个参数”时,您是指统计意义上的参数(在这种情况下,您的静脉输液在哪里),还是您指的是变量(在这种情况下,您的参数在哪里)?请阐明符号的作用-测得的是什么,未知的是什么?
Glen_b-恢复莫妮卡

1
我认为V是A ^ 3。那就是我用的,我的情节看起来和他一样。
戴夫·富尼耶

@Glen_b我只是假定Birch–Murnaghan函数中的Y轴为E,而x轴为V。这四个参数是Birch–Murnaghan函数中的四个参数。如果您认为自己得到的东西看起来像他的东西。
戴夫·富尼耶

啊,等等,我终于明白了。不是期望运算符(正如我希望在方程的LHS上看到的那样,在RHS上没有错误项),E是以y x 形式写为函数的响应变量。对所有人的重要提示:在未仔细定义您的意思的情况下,请不要在统计学家的回归方程式左侧显示带有E 的方程式,因为他们可能会认为这是一种期望。ËËÿXË
Glen_b-恢复莫妮卡

Answers:


8

这是一个普通的最小二乘问题!

定义

X=V-2/3 w=V01个/3

该模型可以重写

ËË|V=β0+β1个X+β2X2+β3X3

其中,系数以代数经由相关的原始系数β=β一世

16β=16Ë0+540w3-900w3-1440w5+2700w51260w7-2700w7-360w9+900w9

这是简单的代数或数值求解:挑溶液为其,和瓦特都是正的。这样做的唯一原因是为了获得的估计00w ^,和ë 0,并验证它们是物理意义。所有的拟合分析都可以根据β进行00w00wË0β

这种方法不仅比非线性拟合简单得多,也更准确:用于方差-协方差矩阵通过非线性拟合返回仅仅是一个局部的二次近似的采样这些参数的分布,而(对于测量E的正态分布误差,无论如何)OLS结果不是近似值。Ë000V0Ë

:置信区间,预测间隔等可以按照通常的方式,而不需要找到这些值获得的计算它们在估计方面β以及它们的方差-协方差矩阵。(甚至Excel都可以做到这一点!)这是一个示例,后面是生成它的(简单)代码。β^R

数字

#
# The data.
#
X <- data.frame(V=c(41, 43, 46, 48, 51, 53, 55.5, 58, 60, 62.5),
                E=c(-48.05, -48.5, -48.8, -49.03, -49.2, -49.3, -49.35, 
                    -49.34, -49.31, -49.27))
#
# OLS regression.
#
fit <- lm(E ~ I(V^(-2/3)) + I(V^(-4/3)) + I(V^(-6/3)), data=X)
summary(fit)
beta <- coef(fit)
#
# Prediction, including standard errors of prediction.
#
V0 <- seq(40, 65)
y <- predict(fit, se.fit=TRUE, newdata=data.frame(V=V0))
#
# Plot the data, the fit, and a three-SEP band.
#
plot(X$V, X$E, xlab="Volume", ylab="Energy", bty="n", xlim=c(40, 60))
polygon(c(V0, rev(V0)), c(y$fit + 3*y$se.fit, rev(y$fit - 3*y$se.fit)),
        border=NA, col="#f0f0f0")
curve(outer(x^(-2/3), 0:3, `^`) %*% beta, add=TRUE, col="Red", lwd=2)
points(X$V, X$E)

如果您对原始参数估计值的联合分布感兴趣,则可以通过OLS解决方案轻松进行模拟:只需生成多元正态实现并将其转换为参数即可。这是2000个此类实现的散点图矩阵。强大的曲线表明了为什么Delta方法可能会产生较差的结果。β

图2


1
确实,用于拟合线性模型的算法在数值上要比针对非线性模型的算法稳定得多,但只要非线性拟合算法收敛,诊断的准确性就不会存在差异。我检查了一下,我们对至少4个信号图具有相同的残差平方和。同样,您选择的线性参数设置也很混乱,因此根据t检验,所有参数都不重要。我所有的都是。没什么大不了的,但是很有趣,可能会使年轻球员感到困惑。
戴夫·富尼耶

另外,我猜您没有回答OP的问题,因为她说她想要焓函功能的置信限度
dave fournier

1
βË0Ë^0

独立于参数设置,您的模型和我的模型是相同的。(我在说的是OLS模型。)的确,如果特定参数线性输入模型,则标准偏差会对该参数产生更好的置信度。无论是用于参数化模型还是作为因变量求解,通过delta方法获得的标准偏差都将相同。在这种情况下,感兴趣的因变量是焓-体积-函数,无论使用参数化还是我的参数化,其增量方法std dev都相同。
戴夫·富尼尔2016年

1
β^

3

一世G

-GŤ一世G
这为您提供了该因变量的估计方差。取平方根以获得估计的标准偏差。那么置信限为预测值+-两个标准偏差。这是标准可能性的东西。对于非线性回归的特殊情况,您可以校正自由度。您有10个观测值和4个参数,因此可以通过乘以10/6来增加模型中方差的估计。几个软件包将为您完成此任务。我在AD模型构建器的AD模型中编写了您的模型,并将其拟合并计算了(未修改的)方差。它们将与您的稍有不同,因为我不得不猜测一些值。
                    estimate   std dev
10   pred_E      -4.8495e+01 7.5100e-03
11   pred_E      -4.8810e+01 7.9983e-03
12   pred_E      -4.9028e+01 7.5675e-03
13   pred_E      -4.9224e+01 6.4801e-03
14   pred_E      -4.9303e+01 6.8034e-03
15   pred_E      -4.9328e+01 7.1726e-03
16   pred_E      -4.9329e+01 7.0249e-03
17   pred_E      -4.9297e+01 7.1977e-03
18   pred_E      -4.9252e+01 1.1615e-02

可以对AD Model Builder中的任何因变量执行此操作。这样在代码的适当位置声明一个变量

   sdreport_number dep

并像这样编写代码以评估因变量

dep=sqrt(V0-cube(Bp0)/(1+2*max(V)));

请注意,此值是针对自变量的值进行评估的,该值是模型拟合中观察到的最大值的2倍。拟合模型并获得该因变量的标准偏差

19   dep          7.2535e+00 1.0980e-01

我修改了程序,以包含用于计算焓-体积函数的置信度极限的代码。代码(TPL)文件如下所示

DATA_SECTION
 init_int nobs
 init_matrix data(1,nobs,1,2)
 vector E
 vector V
 number Vmean
LOC_CALCS
 E=column(data,2);
 V=column(data,1);
 Vmean=mean(V);

PARAMETER_SECTION
 init_number E0
 init_number log_V0_coff(2)
 init_number log_B0(3)
 init_number log_Bp0(3)
 init_bounded_number a(.9,1.1)
 sdreport_number V0
 sdreport_number B0
 sdreport_number Bp0
 sdreport_vector pred_E(1,nobs)
 sdreport_vector P(1,nobs)
 sdreport_vector H(1,nobs)
 sdreport_number dep
 objective_function_value f
PROCEDURE_SECTION
  V0=exp(log_V0_coff)*Vmean;
  B0=exp(log_B0);
  Bp0=exp(log_Bp0);
  if (current_phase()<4)
  f+=square(log_V0_coff) +square(log_B0);

  dvar_vector sv=pow(V0/V,0.66666667);
  pred_E=E0 + 9*V0*B0*(cube(sv-1.0)*Bp0
    + elem_prod(square(sv-1.0),(6-4*sv)));

  dvar_vector r2=square(E-pred_E);
  dvariable vhat=sum(r2)/nobs;
  dvariable v=a*vhat;
  f=0.5*nobs*log(v)+sum(r2)/(2.0*v);

  // code to calculate the  enthalpy-volume function
  double delta=1.e-4;
  dvar_vector svp=pow(V0/(V+delta),0.66666667);
  dvar_vector svm=pow(V0/(V-delta),0.66666667);
  P = -((9*V0*B0*(cube(svp-1.0)*Bp0
      + elem_prod(square(svp-1.0),(6-4*svp))))
      -(9*V0*B0*(cube(svm-1.0)*Bp0
      + elem_prod(square(svm-1.0),(6-4*svm)))))/(2.0*delta);
  H=E+elem_prod(P,V);

dep=sqrt(V0-cube(Bp0)/(1+2*max(V)));

然后,我对模型进行了调整,以获取H估计值的标准开发者。

29   H           -3.9550e+01 5.9163e-01
30   H           -4.1554e+01 2.8707e-01
31   H           -4.3844e+01 1.2333e-01
32   H           -4.5212e+01 1.5011e-01
33   H           -4.6859e+01 1.5434e-01
34   H           -4.7813e+01 1.2679e-01
35   H           -4.8808e+01 1.1036e-01
36   H           -4.9626e+01 1.8374e-01
37   H           -5.0186e+01 2.8421e-01
38   H           -5.0806e+01 4.3179e-01

这些是针对您观察到的V值计算的,但可以针对任何V值轻松计算。

已经指出,这实际上是一个线性模型,对于该模型,有简单的R代码可以通过OLS执行参数估计。这对初学者尤其有吸引力。但是,自从Huber从事三十多年的工作以来,我们知道或应该知道,人们应该几乎总是应该用中等强度的替代产品来代替OLS。我认为这不是常规执行的原因是健壮的方法本质上是非线性的。从这个角度来看,R中简单易用的OLS方法更像是陷阱而不是功能。AD Model Builder方法的优势在于其对非线性建模的支持。要将最小二乘码更改为鲁棒的普通混合码,只需更改一行代码。线

    f=0.5*nobs*log(v)+sum(r2)/(2.0*v);

更改为

f=0.5*nobs*log(v)
  -sum(log(0.95*exp(-0.5*r2/v) + 0.05/3.0*exp(-0.5*r2/(9.0*v))));

模型中的过度分散量通过参数a进行测量。如果a等于1.0,则方差与普通模型相同。如果有异常值使方差膨胀,我们预计a将小于1.0。对于这些数据,a的估计值约为0.23,因此方差约为正常模型方差的1/4。解释是,离群值使方差估计值增加了大约4倍。其效果是增加了OLS模型参数的置信范围的大小。这表示效率的损失。对于正常的混合物模型,焓-体积函数的估计标准偏差为

 29   H           -3.9777e+01 3.3845e-01
 30   H           -4.1566e+01 1.6179e-01
 31   H           -4.3688e+01 7.6799e-02
 32   H           -4.5018e+01 9.4855e-02
 33   H           -4.6684e+01 9.5829e-02
 34   H           -4.7688e+01 7.7409e-02
 35   H           -4.8772e+01 6.2781e-02
 36   H           -4.9702e+01 1.0411e-01
 37   H           -5.0362e+01 1.6380e-01
 38   H           -5.1114e+01 2.5164e-01

有人看到,点估计值有很小的变化,而置信度限制已降低到OLS产生的置信度限制的60%。

我要说明的主要一点是,一旦更改了TPL文件中的一行代码,所有修改的计算都会自动发生。


2
一世

1
ËËVËËVËHV

1
@jwimberley,您基本上是说dave Fourier给出了(条件)均值置信区间的公式,而百里香可能对新观察的预测区间感兴趣。对于OLS,计算后者很容易。在这种情况下如何计算?
DeltaIV '16

1
Ë=FV+ϵË-Ë^ϵVϵϵ
jwimberley

1
@jwimberley我仅显示了与观察到的V值相对应的预测值的置信度极限,这仅仅是因为它们是可用的。我已经编辑了答案,以显示如何获取任何因变量的置信度限制。
戴夫·富尼尔2016年

0

交叉验证是估算曲线可靠性的一种简单方法:https : //en.wikipedia.org/wiki/Cross-validation_(statistics)

ΔË0ΔV0Δ0Δ

您可以通过以下方法计算1倍验证误差:将其中一个点远离拟合,并使用拟合曲线预测剩余点的值。对所有点重复此操作,以使每个点都保留一次。然后,计算最终曲线(所有点均拟合的曲线)的验证误差,作为预测误差的平均值。

这只会告诉您模型对任何新数据点的敏感程度。例如,它不会告诉您能量模型有多不准确。但是,这将是更实际的误差估计(仅拟合误差)。

另外,您可以根据需要绘制预测误差与体积的关系图。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.