27
Programmation dans Chapitre 3. Simulation Programmation dans Chapitre 3. Simulation M2 CEE Pr. Philippe Polomé, Université Lumière Lyon 2 2016 – 2017

Programmation dans Chapitre 3. Simulation

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Programmation dans

Chapitre 3. Simulation

M2 CEE

Pr. Philippe Polomé, Université Lumière Lyon 2

2016 – 2017

Page 2: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Définitions

Introduction

I Les procédures de simulation sont utilisées pour évaluer desalgorithmes

I c’est-à-dire : un test ou un estimateurI Typiquement 3 étapes conceptuelles

1. Générer des données dans l’ordinateurI Sur la base d’une ou pls lois (DGP : Data-Generating-Process)

2. Évaluer les quantités d’intérêtI p-valeurs &/ouI paramètres estimés &/ouI prédictions d’un modèle

3. Itérer ces 2 premiers pas sur plusieurs scénarios

I Ensuite, il faut présenter les résultats

Page 3: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Définitions

Exemples

I 2 “lessons” de SWIRLI R Programming, Lesson 13 SimulationI Regression Models, Lesson 10 Variance Inflation Factors

I Comparer la puissance des tests d’autocorrélation deDurbin-Watson & Breusch-Godfrey

I dans 2 spécifications d’une régression linéaire

Page 4: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Définitions

Petits rappels

1. Puissance d’un testI Probabilité qu’il rejette H0 lorsque H0 est fausseI Puissance = 1 � � = 1 � Pr{Type II error}I Dépend de la taille de l’éch.I mais aussi de la fausseté de H0

2. Séries AR(1) ✏t = ⇢✏t�1 + µt est stationnaire siI µt bruit blanc (stationnaire, non-corrélé)I |⇢| < 1

3. Les tests de Durbin-Watson & Breusch-GodfreyI servent tous deux à détecter un terme d’erreur AR(1)

stationnaireI Mais le premier n’est pas valable s’il y a un retard de y dans

les régresseurs

Page 5: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Définitions

Survol du programme

I On définit 3 fonctions dans RI qui capturent les 3 étapes ci-dessus

I Générer, évaluer, itérerI Ensuite on lance la simulation

I et on présente le résumé des résultatsI numériquement & graphiquement

I Soient 2 DGP linéairesI Un modèle “trend” : yi = �1 + �2i + ✏i

I i indice le temps car i est un numéro de ligneI Un modèle “dynamic” : yi = �1 + �2yi�1 + ✏i

I Durbin-Watson n’est pas valable dans le cas de ce 2nd modèleI ✏ suit un AR(1) stationnaire

I ✏i = ⇢✏i�1

+ µi i = 1...n |⇢| < 1I On fixe

I � = (.25;�.75)0

I ✏0 = 0

Page 6: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Définitions

Survol du programme

I ! ! On prend ces 2 DGP pour générer les données ! !I On sait ce qui est vraiI On veut voir si les tests arrivent à nous le direI Parce que s’ils ne peuvent pas en conditions simulées, il ne

pourront pas dans la natureI On veut évaluer la puissance des 2 tests

I Pour les 2 DGP (trend, dynamic)I Pour une taille ↵ = 0.05 (size ds R)

I ↵ = proba de RH0

alors que H0

est vraieI On pourrait regarder pls niveaux de ↵

I Pour différents niveaux d’autocorrélationI ⇢ = 0; 0.2; 0.4; 0.6; 0.8; 0.9; 0.95; 0.99

I Pour 3 tailles d’éch. n = 15; 30; 50I on pourrait aussi faire 5000 au lieu de 50 pour n ! 1

Page 7: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation étape 1 : générer des données

Générer les données

I On implémente les 2 DGP (trend & dynamic)I en créant une fonction dgp( )

I De la manière suivante :I Énoncer les arguments de la dgp

I et leurs valeurs par défautI Spécifier comment ces arguments vont acquérir une valeur

I Créer une matrice multidimensionnelle des valeurs desparamètres

I nbr tailles éch. (3) ⇥ nbr modèles (2) ⇥ nbr corrélations (8)I Spécifier comment les données sont générées pour chaque jeu

de valeurs des paramètres

Page 8: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation étape 1 : générer des données

Générer les données – créer la fonction dgp

I Les arguments qu’il faut donner à dgp sont :I nobs le nombre d’obs., défaut 15I model spécifie l’équation,

I peut prendre 2 valeurs : "trend" et “dynamic”I corr autocorrélation ⇢, défault 0I coef les vraies valeurs �, défaut 0.25 et -0.75I sd “standard deviation” – écart-type de l’erreur ✏

ICréer la fonction

dgp <- function(nobs = 15, model = c("trend", "dynamic"), corr= 0, coef = c(0.25, -0.75), sd = 1)

I À ce stade, la fonction est un récipient videI mais des arguments peuvent lui être passés

I des valeurs par défaut sont définiesI Ces arguments sont utilisés plus loin

Page 9: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation étape 1 : générer des données

Générer les données – structure de dgp

I À l’intérieur de dgp, on fabrique ✏ et yI Pour chaque modèle

I dgp ensuite renvoie les données dans un “data.frame”I La structure des commandes à l’intérieur de dgp est

{ définition de l’erreurif(model is “trend”){create data of trend model}else {data of dynamic model}}

Page 10: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation étape 1 : générer des données

Générer les données – corps de dgp

{model <- match.arg(model)

I saisit l’argument “model” passé à dgpI soit “trend”, soit “dynamic”I et le place dans l’objet model

err <- as.vector(filter(rnorm(nobs, sd = sd), corr, method ="recursive"))

I filter crée une série temp.I de nobs valeurs d’une v.a. normale d’écart-type sd et

autorégressive de coefficient “corr”I as.vector traite la série temp. comme un vecteur

if(model == "trend") {I Ici, on définit les valeurs de y pour le modèle “trend” (==)

x <- 1 :nobs crée une tendance (1 à nobs)y <- coef[1] + coef[2] * x + err

Page 11: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation étape 1 : générer des données

Générer les données – corps de dgp

} else {I Idem pour le modèle “dynamic”

y <- rep(NA, nobs)I prépare la place pour y

y[1] <- coef[1] + err[1]for(i in 2 :nobs)y[i] <- coef[1] + coef[2] * y[i-1] + err[i]

I Définition récursive de y

x <- c(0, y[1 :(nobs-1)])} fin du “else”return(data.frame(y = y, x = x))

I On est tjrs dans dgpI produit le dataframe de y & x (= soit trend, soit lag de y)

}I dgp est définie

I elle emploie bien les paramètres coef, nobs, model, sd et corr

Page 12: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation étape 2 : évaluer les quantités d’intérêt

Évaluation pour un seul scénario : principe

I En se basant sur cette DGPI Dans laquelle toutes les séries de donnés ont un terme

d’erreur AR(1)I sauf lorsque ⇢ = 0 (corr)

I On calcule la puissance du test pour une combinaison deparamètres

I Une telle combinaison s’appelle un scénario

I Les paramètres sont coef, nobs, model, sd et corrI Mais seules les variations de nobs, model et corr sont d’intérêt

I La puissance va être mesurée par le nombre de fois que lap-valeur est .05

I Sachant que H0 est “absence d’autocorrélation”I pour les 2 tests

I Ce nombre de fois est le nombre d’itérations

I régi par une fonction simpower( )

Page 13: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation étape 2 : évaluer les quantités d’intérêt

Évaluation pour un seul scénario : conception de simpower

I Dans simpower( ), on va itérerI via un loop (boucle) for( )

I Par défaut, avec nrep = 100 itérationsI dans lequel on génère un jeu de données en utilisant dgp( )

I Dans ce jeu de donnéesI appliquer dwtest( ) (Durbin-Watson) & bgtest( )

(Breusch-Godfrey)I aux résidus de la régression de y~x

I stocker les 2 p-valeurs associéesI En terminant le loop for( )

I Renvoyer la proportion de p-valeurs significatives, soit < .05

Page 14: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation étape 2 : évaluer les quantités d’intérêt

Évaluation pour un seul scénario : écriture de simpower

I D’abord on déclare simpowerI nrepI size pour se donner la possibilité de contrôler le ↵ dans les

tests qui suiventI ... pour que simpower passe les paramètres de dgp

simpower <- function(nrep = 100, size = 0.05, ...){pval <- matrix(rep(NA, 2 * nrep), ncol = 2)

I On crée une matrice “pval”I de taille nrep ⇥ 2 (car 2 tests)I remplie de NA – qu’on va remplir par la suite

colnames(pval) <- c("dwtest", "bgtest")I noms des col. de pval

Page 15: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation étape 2 : évaluer les quantités d’intérêt

Évaluation pour un seul scénario : loop de simpower

for(i in 1 :nrep) loop for, sur i, de 1 à nrep{dat <- dgp(...)

I Exécute dgp, en renvoyant les données dans datI L’arg ... fait que des arguments passent d’une fonction à une

autreI Ça permet de mettre les arg de dgp dans une fonction

ultérieure qui “enveloppera” dgp et simpower

pval[i,1] <- dwtest(y ~ x, data = dat, alternative ="two.sided")$p.value

I p-valeurs du Durbin-WatsonI On en rempli la 1º col de la matrice pvalI Lorsque le modèle est “dynamic”, dw n’est en principe pas

valablepval[i,2] <- bgtest(y ~ x, data = dat)$p.value

I Idem pour Breush-Godfrey sur la 2º col de pval}

Page 16: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation étape 2 : évaluer les quantités d’intérêt

Évaluation pour un seul scénario : renvoyer les résultats

return(colMeans(pval < size))I Prend la moyenne par col du nombre de fois où pval<size

I l’expression pval < size va retourner 1 si pval < 0.05 (la taillepar défaut), zéro sinon

I return( ) sert en programmation pour renvoyer le résultat del’opération entre ( )

I C’est le résultat de la fonction utilisable à l’extérieurI Si la fin d’une fonction est atteinte sans un return, la valeur

de la dernière expression évaluée est renvoyée

} Ceci ferme simpowerI Les calculs sont essentiellement finis

I On a donc à présent 2 “blocs” : dgp & simpowerI le 1º crée les données, le 2º calcule la puissanceI Il faut à présent invoquer ces blocs en passant les paramètres

désirés

Page 17: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation step 3 : Itérer sur plusieurs scénarios

Évaluation sur tous les scénarios par itération

I On crée une 3º fonction

simulation <- function(corr = c(0, 0.2, 0.4, 0.6, 0.8, 0.9, 0.95,0.99), nobs = c(15, 30, 50), model = c("trend", "dynamic"), ...)

I simulation va invoquer simpowerI sur les différentes combinaisons de paramètres (scénarios)

qu’on lui passeI autocorrelation corr, sample size nobs, model

I Comme dgp va être appelée (par simpower) sur des vecteursde paramètres,

I chaque i de simpower va calculer autant de proportionsI Ici : 8 niveaux de corrélations ⇥ 3 tailles d’éch. ⇥ 2 modèles

= 48 jeux de données

Page 18: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation step 3 : Itérer sur plusieurs scénarios

Évaluation sur tous les scénarios par itération

I Dans la prochaine diapo, la fonction simulationI crée les scénarios dans un “data.frame”

I par la commande expand.grid( )I ensuite passe ces scénarios à simpower

I qui les repasse à dgpI avec les mêmes noms

I calcule les puissances des 2 tests pour chaque scénarioI via un loop for( ) qui reprend chaque scénario en appelant une

cellule de expand.grid( )I réarrange les résultats et les stocke dans un “data.frame”

Page 19: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation step 3 : Itérer sur plusieurs scénarios

Évaluation sur tous les scénarios par itération

{prs <- expand.grid(corr = corr, nobs = nobs, model = model)

I Crée un data frame appelé prs contenant les scénarios qu’on aenvoyés dans la fonction “simulation”

I Ce data frame contient une ligne par scénarioI 1º col : corr ; 2º : nobs ; 3º : model

nprs <- nrow(prs)pow <- matrix(rep(NA, 2 * nprs), ncol = 2)

I Comme pval, une matrice pow remplie de NA avec 2 col etnprs lignes

for(i in 1 :nprs) pow[i,] <- simpower(corr = prs[i,1], nobs = prs[i,2],model = as.character(prs[i,3]), ...)

I loop (for) pour remplir les lignes de powI en appelant simpower sur le sénarion correspondant (corr,

nobs, model)I Simpower renvoie les proportions de tests DW (col 1) et BG

(col 2) significatifs

Page 20: Programmation dans Chapitre 3. Simulation

Évaluation sur tous les scénarios : sorties

I La fin de la fonction “simulation” présente les résultats

rval <- rbind(prs, prs)I Matrice rval : concaténation verticale de matrices prs

I 2 prs l’une au-dessus de l’autrerval$test <- factor(rep(1 :2, c(nprs, nprs)), labels = c("dwtest", "bgtest"))

I Ajoute une col “test” à la matrice rvalI Cette col contient un factor à 2 niveaux : dwtest & bgtest

rval$power <- c(pow[,1], pow[,2])I Ajoute 1 col “power” avec les éléments de col 1 & 2 de pow

I donc, les résultats de simpower

rval$nobs <- factor(rval$nobs)I Ajoute une col “nobs”

return(rval)I Renvoie la matrice rval, contenant les résultats de simpower

I dans la col power selon la matrice powI en rajoutant 2 cols nobs et test, selon prs

} ceci ferme la fonction “simulation

Page 21: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation : Présentation des résultats

Simulation steps : résumé

I Le programme de simulation est completI il faut l’appeler et présenter les résultatsI Avant ça, un résumé du programme en mots

I En Step 3, Simulation crée la matrice prs dont les lignescomprennent

I une corrélation parmi {0, 0.2, 0.4, 0.6, 0.8, 0.9, 0.95, 0.99}I une taille d’éch. parmi {15, 30, 50}I un modèle {trend, dynamic}

I Step 3 Simulation appele Step 2 Simpower qui appelle Step 1dgp

I qui crée une jeu de données correspondant à ce scénarioI un parmi 8x3x2 48 jeux de donnée

Page 22: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation : Présentation des résultats

Simulation steps : résumé

I En Step 2, Simpower calcule 2 tests (DW & BG) sur lesrésidus de la régression y~x

I Si le jeu de données correspond à un modèle “dynamic”, DWn’est pas approprié

I Step 2 répète ce calcul 100 fois (=nrep)I puis calcule la proportion de test donnat une pval<0.05I donc, RH

0

où H0

: absence d’autocorrélationI Un scénario est une cellule de la matrice prs

I Step 3 Simulation continue à appeler Step 2 Simpower jusqu’àarriver au bout des cellules

I Cette division en Steps (blocs)I n’est pas obligatoireI mais améliore la lisibilité du codeI et permet de réutiliser certains steps dans d’autres simulations

Page 23: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation : Présentation des résultats

Simulation : la fin

I À présent on appelle simulation( )I Éventuellement on fixe la seed

I set.seed(123)

psim <- simulation( )I simulation ( ) renvoie rval - donc psim est rvalI Si on ne change pas les défauts, ce programme prend moins

d’une minuteI Avec 100 itérations dans Simpower (nrep=100)

I La précision n’est pas très élevéeI Mais passer à 10 000 ne demande que de changer un

paramètreI Pour présenter les résultats

I Il est facile d’utiliser des tables numériquesI Via xtabs( ), qui transforme le “data.frame” en “table” qui

classe selon les 4 paramètres (corr ect)

tab <- xtabs(power ~ corr + test + model + nobs, data = psim)

Page 24: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation : Présentation des résultats

Simulation : la fin

I Pour présenter cette table,I on peut utiliser ftable( ) (flat table)

I Les valeurs de ⇢ dans les col et les autres paramètres sur leslignes

ftable(tab, row.vars = c("model", "nobs", "test"), col.vars ="corr")

I Comme on met les résultats du test sur la dernière ligneI la table permet de comparer la puissance entre les 2 tests dans

les mêmes conditionsI Durbin-Watson est un peu meilleur dans le modèle trend, mais

cet avantage sur Breusch-Godfrey diminue en augmentant ⇢ &n

I dans le modèle dynamic, Durbin-Watson n’a pratiquement pasde puissance sauf à de très hautes corrélations, alors queBreusch-Godfrey est acceptable

Page 25: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation : Présentation des résultats

Simulation : Graphiques

I On peut aussi présenter les résultats dans un graphiqueI avec la même interprétationI mais qui rend mieux les différences

library("lattice")xyplot(power ~ corr | model + nobs, groups = ~ test, data = psim,type = "b")

Page 26: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation : Présentation des résultats

Avec nrep =1000 – bleu = DW ; rose = BG

Page 27: Programmation dans Chapitre 3. Simulation

Programmation dans Chapitre 3. Simulation

Simulation : Présentation des résultats

Devoir 3

I Répliquer la présente analyse avec 2 autres testsI p.e. 2 tests d’hétéroscédasticité

I ou bien 2 tests npI sur données simulées évidemment

I mais la procédure de simulation peut varierI Lesson de SWIRL

I Regression Models, Lesson 10 Variance Inflation Factors