Bootstrap résiduels: est-ce que je le fais bien?

10

Tout d'abord: D'après ce que j'ai compris, les résidus d'amorçage fonctionnent comme suit:

  1. Adapter le modèle aux données
  2. Calculez les résidus
  3. Rééchantillonnez les résidus et ajoutez-les à 1.
  4. Ajuster le modèle au nouvel ensemble de données à partir de 3.
  5. Répétez les ntemps, mais ajoutez toujours les résidus rééchantillonnés à l'ajustement à partir de 1.

Est-ce correct jusqu'à présent?


Ce que je veux faire, c'est quelque chose de légèrement différent:

Je veux estimer l'incertitude des paramètres et des prévisions pour un algorithme qui estime une variable environnementale.

Ce que j'ai, c'est une série chronologique sans erreur (à partir d'une simulation) de cette variable x_true, à laquelle j'ajoute du bruit, x_noiseafin de générer un ensemble de données synthétique x. J'essaie ensuite de trouver des paramètres optimaux en ajustant mon algorithme avec la somme des carrés sum((x_estimate - x_true)^2)(! Pas x_estimate - x!) Comme fonction objective. Afin de voir comment mon algorithme fonctionne et de créer des échantillons de la distribution de mes paramètres, je veux rééchantillonner x_noise, l'ajouter x_true, ajuster à nouveau mon modèle, rincer et répéter. Est-ce une approche valable pour évaluer l'incertitude des paramètres? Puis-je interpréter les ajustements aux ensembles de données amorcés comme une incertitude de prédiction, ou dois-je suivre la procédure que j'ai publiée ci-dessus?

/ edit: Je pense que je n'ai pas vraiment précisé ce que fait mon modèle. Considérez-le comme essentiellement une méthode de débruitage. Ce n'est pas un modèle prédictif, c'est un algorithme qui essaie d'extraire le signal sous-jacent d'une série chronologique bruyante de données environnementales.

/ edit ^ 2: Pour les utilisateurs de MATLAB , j'ai écrit un exemple de régression linéaire rapide et sale de ce que je veux dire.

C'est ce que je pense être l'amorçage "ordinaire" des résidus (veuillez me corriger si je me trompe): http://pastebin.com/C0CJp3d1

Voici ce que je veux faire: http://pastebin.com/mbapsz4c

Fred S
la source
Ce sera plus clair si vous montrez le code que vous avez fait jusqu'à présent.
Mesures
En fait, je n'ai rien codé jusqu'à présent en termes d'amorçage. Le code de mon modèle est assez complexe, je ne remercie pas cela aiderait. À titre d'exemple, nous pouvons supposer que le modèle est une procédure de lissage comme une moyenne mobile, avec la fenêtre mobile comme seul paramètre du modèle. J'ai une série de mesures (synthétiques) au fil du temps et j'ajoute une erreur (pas nécessairement homoscédastique et normalement distribuée) à cela. Je veux ensuite estimer la fenêtre mobile qui se rapproche le plus du "vrai" sous-jacent que je connais et je veux évaluer l'incertitude en amorçant mon erreur synthétique. Est ce que ça aide?
Fred S
Voici un très mauvais pseudo-code de style MATLAB, peut-être que cela aide à comprendre ce que j'aimerais faire: pastebin.com/yTRahzr5
Fred S
Désolé Fred, je ne connais pas Matlab.Veuillez marquer comme Matlab pour obtenir les entrées des utilisateurs.
Métriques du
2
Oh ma question n'est vraiment pas limitée à MATLAB (et ce n'est pas vraiment du code MATLAB, c'est juste un pseudo-code basé sur la syntaxe MATLAB pour les boucles for et les commentaires qui ne fonctionnerait pas de toute façon). Mais je peux le marquer au cas où.
Fred S

Réponses:

8

Voici l'algorithme général (semi-paramétrique-bootstrap) plus en détail:

= nombre de bootstrapsB

le modèle:
y=Xβ+ϵ

laissez ε être les résidusϵ^

  1. Exécuter la régression et obtenir l'estimateur et des résidus e .β^ϵ^
  2. Rééchantillonner les résidus avec le remplacement et obtenir le vecteur résiduel bootstrapped de B .ϵ^B
  3. yB=Xβ^+ϵ^B
  4. yBXβ^B
  5. B
Sweetbabyjesus
la source
1

Je ne suis pas sûr que ma compréhension soit correcte. Mais voici ma suggestion de modifier votre code ("bootstrapping ordinaire des résidus", lignes 28-34) en:

for i = 2:n_boot  
x_res_boot = x_residuals( randi(n_data,n_data,1) );  
x_boot = x_res_boot+ x_best_fit;  
p_est(:, i) = polyfit( t, x_boot, 1 );  
x_best_fit2 = polyval( p_est(:, i), t );  
x_residuals = x_best_fit2 - x_boot;
x_best_fit=x_best_fit2;
end  

L'idée est qu'à chaque fois que vous utilisez des résidus non pas de la première exécution, mais de l'ajustement bootstrap précédent. Quant à moi, tous les autres semblent valables.

Il s'agit d'une version révisée qui a été vérifiée dans MATLAB. Deux erreurs ont été corrigées.

O_Devinyak
la source
Oh, eh bien, c'était nouveau pour moi. bsxfun est quelque peu compliqué; voici une nouvelle version qui utilise votre idée et devrait être un peu plus claire. Cependant, cela produit des résultats quelque peu étranges. C'est le résultat de rééchantillonnage toujours les résidus du premier meilleur ajustement et les ajouter à la même (mon idée initiale), et c'est ce qui se passe si je RESAMPLE les résidus de chaque itération et les ajouter à chaque nouveau meilleur ajustement. Des idées?
Fred S
Oups, petite erreur dans la ligne 25 (devrait être p_est (:, i) au lieu de p_est (:, 1)), mais même quand je corrige que les distributions des paramètres semblent toujours bancales: cliquez sur
Fred S
1
La réponse est fixe et vérifiée dans MATLAB. Maintenant ça va bien.
O_Devinyak
1
De nouveaux résidus pour chaque ajustement - c'était ma première compréhension du bootstrap résiduel. Mais je dois admettre que différentes sources utilisent à cet effet des résidus d'ajustement aux données d'origine. Voici un joli tutoriel sur le bootstrap ( econ.pdx.edu/faculty/KPL/readings/mackinnon06.pdf ). Semble que mon approche est mauvaise alors que votre mise en œuvre est correcte. Dois-je supprimer la réponse donnée?
O_Devinyak
1
Merci pour le suivi. À mon humble avis, laissez la réponse aux autres utilisateurs avec la même question. J'ai trouvé que la littérature (du moins celle dont je dispose) n'est pas toujours claire à ce sujet et peut être assez déroutante.
Fred S
1

Pour voir comment un algorithme fonctionne en termes de précision prédictive / erreur quadratique moyenne, vous avez probablement besoin du bootstrap "optimisme" Efron-Gong. Ceci est implémenté pour une utilisation facile dans le rmspackage R. Voir ses fonctions ols, validate.ols, calibrate.

Frank Harrell
la source