Il existe une approche standard pour cela appelée la méthode delta. Vous formez l'inverse de la Hesse de la log-vraisemblance par rapport à vos quatre paramètres. Il existe un paramètre supplémentaire pour la variance des résidus, mais il ne joue aucun rôle dans ces calculs. Ensuite, vous calculez la réponse prévue pour les valeurs souhaitées de la variable indépendante et calculez son gradient (la dérivée par rapport à ces quatre paramètres). Appelons l'inverse de la Hesse et du vecteur de gradient . Vous produit matriciel vectoriel
Ig
−gtIg
Cela vous donne la variance estimée pour cette variable dépendante. Prenez la racine carrée pour obtenir l'écart type estimé. alors les limites de confiance sont la valeur prédite + - deux écarts-types. C'est un truc de vraisemblance standard. pour le cas particulier d'une régression non linéaire, vous pouvez corriger les degrés de liberté. Vous disposez de 10 observations et de 4 paramètres pour augmenter l'estimation de la variance dans le modèle en multipliant par 10/6. Plusieurs progiciels le feront pour vous. J'ai rédigé votre modèle dans AD Model dans AD Model Builder, je l'ai ajusté et j'ai calculé les variances (non modifiées). Ils seront légèrement différents des vôtres car je devais deviner un peu les valeurs.
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
Cela peut être fait pour n'importe quelle variable dépendante dans AD Model Builder. On déclare une variable à l'endroit approprié dans le code comme ceci
sdreport_number dep
et écrit le code évaluer la variable dépendante comme ceci
dep=sqrt(V0-cube(Bp0)/(1+2*max(V)));
Notez que cela est évalué pour une valeur de la variable indépendante 2 fois la plus grande observée dans l'ajustement du modèle. Ajuster le modèle et on obtient l'écart type pour cette variable dépendante
19 dep 7.2535e+00 1.0980e-01
J'ai modifié le programme pour inclure le code de calcul des limites de confiance pour la fonction enthalpie-volume Le fichier de code (TPL) ressemble à
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)));
J'ai ensuite réaménagé le modèle pour obtenir les devs standard pour les estimations 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
Ceux-ci sont calculés pour vos valeurs V observées, mais pourraient être facilement calculés pour n'importe quelle valeur de V.
Il a été souligné qu'il s'agit en fait d'un modèle linéaire pour lequel il existe un code R simple pour effectuer l'estimation des paramètres via OLS. C'est très attrayant en particulier pour les utilisateurs naïfs. Cependant, depuis les travaux de Huber il y a plus de trente ans, nous savons ou devons savoir que l'on devrait probablement presque toujours remplacer OLS par une alternative modérément robuste. La raison pour laquelle cela n'est pas systématiquement fait, je crois, c'est que les méthodes robustes sont intrinsèquement non linéaires. De ce point de vue, les méthodes OLS attrayantes simples dans R sont plus un piège, plutôt qu'une fonctionnalité. Un avantage de l'approche AD Model Builder est sa prise en charge intégrée pour la modélisation non linéaire. Pour changer le code des moindres carrés en un mélange normal robuste, une seule ligne du code doit être modifiée. La ligne
f=0.5*nobs*log(v)+sum(r2)/(2.0*v);
est changé en
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))));
La quantité de surdispersion dans les modèles est mesurée par le paramètre a. Si a est égal à 1,0, la variance est la même que pour le modèle normal. S'il y a inflation de la variance par les valeurs aberrantes, nous nous attendons à ce que a soit inférieur à 1,0. Pour ces données, l'estimation de a est d'environ 0,23, de sorte que la variance est d'environ 1/4 de la variance pour le modèle normal. L'interprétation est que les valeurs aberrantes ont augmenté l'estimation de la variance d'un facteur d'environ 4. Cela a pour effet d'augmenter la taille des limites de confiance pour les paramètres du modèle OLS. Cela représente une perte d'efficacité. Pour le modèle de mélange normal, les écarts-types estimés pour la fonction enthalpie-volume sont
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
On constate qu'il y a de petits changements dans les estimations ponctuelles, tandis que les limites de confiance ont été réduites à environ 60% de celles produites par OLS.
Le point principal que je veux faire est que tous les calculs modifiés se produisent automatiquement une fois que l'on change la seule ligne de code dans le fichier TPL.