Existe uma abordagem padrão para isso chamada método delta. Você forma o inverso do hessiano da probabilidade logarítmica por seus quatro parâmetros. Há um parâmetro extra para a variação dos resíduos, mas ele não desempenha um papel nesses cálculos. Então você calcula a resposta prevista para os valores desejados da variável independente e calcula seu gradiente (a derivada wrt) nesses quatro parâmetros. Chame o inverso do Hessiano e o vetor gradiente . Você forma o produto da matriz vetorial
Ig
−gtIg
Isso fornece a variação estimada para essa variável dependente. Pegue a raiz quadrada para obter o desvio padrão estimado. então os limites de confiança são o valor previsto + - dois desvios padrão. Isso é coisa de probabilidade padrão. no caso especial de uma regressão não linear, você pode corrigir os graus de liberdade. Você tem 10 observações e 4 parâmetros para poder aumentar a estimativa da variação no modelo multiplicando por 10/6. Vários pacotes de software farão isso por você. Eu escrevi seu modelo no Modelo AD no AD Model Builder e o ajustei e calculei as variações (não modificadas). Eles serão um pouco diferentes dos seus, porque eu tive que adivinhar um pouco os valores.
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
Isso pode ser feito para qualquer variável dependente no AD Model Builder. Um declara uma variável no local apropriado no código como este
sdreport_number dep
e escreve o código para avaliar a variável dependente como esta
dep=sqrt(V0-cube(Bp0)/(1+2*max(V)));
Observe que isso é avaliado para um valor da variável independente 2 vezes a maior observada no ajuste do modelo. Ajuste o modelo e obtenha o desvio padrão para essa variável dependente
19 dep 7.2535e+00 1.0980e-01
Modifiquei o programa para incluir o código para calcular os limites de confiança para a função de volume de entalpia. O arquivo de código (TPL) parece
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)));
Em seguida, reajustei o modelo para obter os desenvolvedores padrão para as estimativas de 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
Eles são calculados para os valores de V observados, mas podem ser facilmente calculados para qualquer valor de V.
Foi apontado que este é realmente um modelo linear para o qual existe um código R simples para realizar a estimativa de parâmetros via OLS. Isso é muito atraente, especialmente para usuários ingênuos. No entanto, desde o trabalho de Huber há mais de trinta anos, sabemos ou devemos saber que provavelmente deve-se quase sempre substituir o OLS por uma alternativa moderadamente robusta. A razão pela qual isso não é feito rotineiramente, acredito, é que métodos robustos são inerentemente não-lineares. Deste ponto de vista, os métodos OLS simples e atraentes em R são mais uma armadilha do que um recurso. Uma vantagem da abordagem do AD Model Builder é o suporte integrado à modelagem não linear. Para alterar o código dos mínimos quadrados para uma mistura normal robusta, apenas uma linha do código precisa ser alterada. A linha
f=0.5*nobs*log(v)+sum(r2)/(2.0*v);
é alterado para
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 quantidade de sobredispersão nos modelos é medida pelo parâmetro a. Se igual a 1,0, a variação é a mesma do modelo normal. Se houver inflação da variação por valores extremos, esperamos que a seja menor que 1,0. Para esses dados, a estimativa de a é de cerca de 0,23, de modo que a variação é de cerca de 1/4 da variação do modelo normal. A interpretação é que os valores discrepantes aumentaram a estimativa de variância em um fator de cerca de 4. O efeito disso é aumentar o tamanho dos limites de confiança dos parâmetros para o modelo OLS. Isso representa uma perda de eficiência. Para o modelo de mistura normal, os desvios padrão estimados para a função de volume de entalpia são
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
Vê-se que há pequenas mudanças nas estimativas pontuais, enquanto os limites de confiança foram reduzidos para cerca de 60% dos produzidos pelo OLS.
O ponto principal que quero destacar é que todos os cálculos modificados ocorrem automaticamente quando um altera a linha de código no arquivo TPL.