clear set more off cd "C:\Users\Adrien\Documents\Documents\COURS\Economie\STATA\Révolution fiscale\" *********** simulation du nouvel IR *********** choix de l'année de simulation dans do_appel_parametres *********** Choix du répertoire racine dans do_appel_parametres (à exécuter en premier) /* clear **set mem 500m set more off /******** appel des paramètres*/ do Programmes/do_appel_parametres /******** appel des variables*/ use Fichiers/indiv_rev_$annee, clear keep id_indiv sort id_indiv merge id_indiv using Fichiers/indiv_ded_$annee keep id_indiv pens_alim_rec sort id_indiv merge id_indiv using Fichiers/indiv_transferts_$annee keep id_indiv pens_alim_rec ppe yt sort id_indiv merge id_indiv using Fichiers/indiv_irpp_$annee keep id_indiv pens_alim_rec ppe irpp* yt sort id_indiv merge id_indiv using Fichiers/indiv_revcap_$annee keep id_indiv pens_alim_rec irpp* ppe rfin_dist_cn rfon_cn csg_yk pl tf yt csk sort id_indiv merge id_indiv using Fichiers/indiv_cotsoc_$annee keep id_indiv pondv pens_alim_rec irpp* ppe rfin_dist_cn rfon_cn csg_yk pl tf csg_ya csg_yr ya_cn yr_cn pension_cn chom_cn yt cs ts csk merge id_indiv using Fichiers/indiv_aut_impots_$annee, sort keep id_indiv pondv pens_alim_rec irpp* ppe rfin_dist_cn rfon_cn csg_yk pl tf csg_ya csg_yr ya_cn yr_cn th pension_cn chom_cn yt cs ts csk merge id_indiv using Fichiers/indiv_logt_$annee, sort keep id_indiv pondv pens_alim_rec irpp* ppe rfin_dist_cn rfon_cn csg_yk pl tf csg_ya csg_yr ya_cn yr_cn th loyer_fictif pension_cn chom_cn yt cs ts csk merge id_indiv using Fichiers/indiv_isf_$annee, sort keep id_indiv pondv pens_alim_rec irpp* ppe rfin_dist_cn rfon_cn csg_yk pl tf csg_ya csg_yr ya_cn yr_cn th loyer_fictif pension_cn chom_cn yt cs ts isf csk k_isf capture gen yk3=rfin_dist_cn+rfon_cn /****************************phase 3: calcul de l'impôt à remplacer*/ capture gen csg=csg_ya+csg_yr+csg_yk capture gen ira=csg+irpp+pl-ppe /****************************phase 4: sauvegarde du fichier simulé*/ keep id_indiv pondv yk3 tf yr_cn ya_cn loyer_fictif th pension_cn chom_cn pens_alim_rec yt isf cs ts csk ira k_isf sort id_indiv save Fichiers/indiv_nouvel_ir_$annee, replace */ /*************************************** DÉBUT DE MON FICHIER ET FIN DE CELUI TIRÉ DE RÉVOLUTION FISCALE **********************************/ /***** Les fonctions de densités sont tracées par tranches, pour que le programme ne soit pas interminable la taille des tranches dépend de leur niveau /////// ////// Du coup les fonctions de densités présentent des sauts purement artificiels quand la taille des tranches change. Ces sauts sont corrigés par le /////// ///// programme CorrigePasDensite.c Il crée un nouveau fichier de densité (volumineux), qu'on peut tracer grâce à GNU par exemple **************************/ // Attention aux forfaits par enfant et aux pensions alimentaires // Comprendre pourquoi revenu_final_a prend des valeurs négatives et revenu_final_monIR la valeur nulle // Proposer une forme de courbe pour revenu_final_monIR___revenu_hors_alloc_a use Fichiers/monIR.dta /************ Déclaration des variables ************/ global t 0.019942 // donné par solveurEquationImpot.c global M 10^6 global r revenu_final_monIR global nouveau_revenu revenu_final_monIR global ancien_revenu revenuImposable /************ Création des variables ************/ /* capture gen revenu_initial = ya_cn + yr_cn + yk3 capture gen revenu_hors_alloc_a = ya_cn + yr_cn + yk3 - th - tf - cs - ts - csk - ira capture gen revenuImposable = yr_cn + ya_cn + yk3 - th - tf - pens_alim_rec replace revenuImposable = 0 if revenuImposable <0 replace revenuImposable = round(revenuImposable,100) capture gen nouveau_pension_cn = 2*pension_cn capture gen nouveau_yr_cn = nouveau_pension_cn + chom_cn capture gen revenuImposableValorise = nouveau_yr_cn + ya_cn + yk3 - th - tf - pens_alim_rec replace revenuImposableValorise = 0 if revenuImposableValorise <0 replace revenuImposableValorise = round(revenuImposableValorise,100) capture gen revenu_final_monIR = $M - $M^($t+1)*(revenuImposable+$M*$t)^(-$t)*$t^$t + 7200 + pens_alim_rec - loyer_fictif capture gen revenu_final_a = ya_cn + yr_cn + yt + yk3 - loyer_fictif - th - tf - cs - ts - csk - ira - isf capture gen revenu_final_monIR_V = $M - $M^($t+1)*(revenuImposableValorise+$M*$t)^(-$t)*$t^$t + 7200 + pens_alim_rec - loyer_fictif capture gen revenu_final_a_V = ya_cn + nouveau_yr_cn + yt + yk3 - loyer_fictif - th - tf - isf - cs - ts - csk - ira */ /*** FCN Donne la somme nationale d'un revenu ***/ capture gen somme=pondv*$r capture replace somme=pondv*$r sum somme display r(sum) /*** FCN Détermine le nombre de revenus négatifs puis les rend nuls ***/ sum pondv if $r<=0 display r(sum) replace $r=0 if $r<0 /*** FCN Exporte en .txt et trace la densité du revenu r ***/ capture gen densiteR=0 //l'arrondi des revenus dépendent du revenu pour que le programme fonctionne rapidement replace $r = round($r,100) forvalues i = 0(100)40000 { quiet:sum pondv if $r == `i' quiet:replace densiteR = r(sum) if $r == `i' } replace $r = round($r,1000) if $r>40000 forvalues i = 40000(1000)200000 { quiet:sum pondv if $r == `i' quiet:replace densiteR = r(sum) if $r == `i' } replace $r = round($r,10000) if $r>200000 forvalues i = 200000(10000)1000000 { quiet:sum pondv if $r == `i' quiet:replace densiteR = r(sum) if $r == `i' } replace $r = round($r,100000) if $r>1000000 forvalues i = 1000000(100000)10000000 { quiet:sum pondv if $r == `i' quiet:replace densiteR = r(sum) if $r == `i' } replace $r = round($r,1000000) if $r>10000000 forvalues i = 10000000(1000000)104000000 { quiet:sum pondv if $r == `i' quiet:replace densiteR = r(sum) if $r == `i' } //on conserve pour chaque revenu le nombre de gens concernés (le nombre de gens qui ont ce revenu et le nombre de ceux qui en ont un inférieur) preserve duplicates drop $r, force sort $r gen fonctionRepartitionR = 0 global temp 0 quiet:levelsof $r, local (l) foreach v of local l { quiet:replace fonctionRepartitionR = densiteR + $temp if $r == `v' quiet:sum fonctionRepartitionR if $r == `v' global temp r(mean) } //on désactive la notation scientifique pour éviter un bug dans le programme .c format densiteR %16.6f format $r fonctionRepartitionR %16.0f //on stocke le résultat dans un fichier .txt, exploité dans solveurEquationImpot.c outsheet densiteR fonctionRepartitionR $r using Mes_resultats/densite_fonctionRepartition_$r.txt, nonames replace //on trace le graphe de la fonction de répartition des revenus imposables en omettant les montants trop grands et le montant 100 pour que le graphique soit lisible twoway (connected densiteR $r in 4/400), saving(Mes_resultats/densite_$r.gph, replace) restore /*** FCN exporte un tableau excel avec la fonction de répartition et la variable ***/ global temp 0 capture gen p = 0 replace $r = round($r,100) forvalues i = 0(100)40000 { quiet: sum pondv if $r == `i' quiet: replace p = $temp + r(sum) if $r == `i' quiet: global temp = ($temp + r(sum)) } replace $r = round($r,1000) if $r>40000 forvalues i = 40000(1000)200000 { quiet: sum pondv if $r == `i' quiet: replace p = $temp + r(sum) if $r == `i' quiet: global temp = ($temp + r(sum)) } replace $r = round($r,10000) if $r>200000 forvalues i = 200000(10000)1000000 { quiet: sum pondv if $r == `i' quiet: replace p = $temp + r(sum) if $r == `i' quiet: global temp = ($temp + r(sum)) } replace $r = round($r,100000) if $r>1000000 forvalues i = 1000000(100000)10000000 { quiet: sum pondv if $r == `i' quiet: replace p = $temp + r(sum) if $r == `i' quiet: global temp = ($temp + r(sum)) } replace $r = round($r,1000000) if $r>10000000 forvalues i = 10000000(1000000)104000000 { quiet: sum pondv if $r == `i' quiet: replace p = $temp + r(sum) if $r == `i' quiet: global temp = ($temp + r(sum)) } preserve duplicates drop $r, force sort $r export excel p $r using Mes_resultats/fonctionRepartition_$r, replace restore /*** FCN Trace pour chaque revenu la proportion de gens désavantagés par le nouveau revenu ***/ capture gen difference=$nouveau_revenu-$ancien_revenu capture replace difference=$nouveau_revenu-$ancien_revenu capture gen proportion_desavantagee=0 capture gen temp = 0 replace $ancien_revenu = round($ancien_revenu,100) forvalues i = 0(100)40000 { quiet:sum pondv if $ancien_revenu == `i' quiet:replace temp = r(sum) quiet:sum pondv if $ancien_revenu == `i' & difference<0 quiet:replace proportion_desavantagee = r(sum)/temp if $ancien_revenu == `i' } replace $ancien_revenu = round($ancien_revenu,1000) if $ancien_revenu>40000 forvalues i = 40000(1000)200000 { quiet:sum pondv if $ancien_revenu == `i' quiet:replace temp = r(sum) quiet:sum pondv if $ancien_revenu == `i' & difference<0 quiet:replace proportion_desavantagee = r(sum)/temp if $ancien_revenu == `i' } replace $ancien_revenu = round($ancien_revenu,10000) if $ancien_revenu>200000 forvalues i = 200000(10000)1000000 { quiet:sum pondv if $ancien_revenu == `i' quiet:replace temp = r(sum) quiet:sum pondv if $ancien_revenu == `i' & difference<0 quiet:replace proportion_desavantagee = r(sum)/temp if $ancien_revenu == `i' } replace $ancien_revenu = round($ancien_revenu,100000) if $ancien_revenu>1000000 forvalues i = 1000000(100000)10000000 { quiet:sum pondv if $ancien_revenu == `i' quiet:replace temp = r(sum) quiet:sum pondv if $ancien_revenu == `i' & difference<0 quiet:replace proportion_desavantagee = r(sum)/temp if $ancien_revenu == `i' } replace $ancien_revenu = round($ancien_revenu,1000000) if $ancien_revenu>10000000 forvalues i = 10000000(1000000)104000000 { quiet:sum pondv if $ancien_revenu == `i' quiet:replace temp = r(sum) quiet:sum pondv if $ancien_revenu == `i' & difference<0 quiet:replace proportion_desavantagee = r(sum)/temp if $ancien_revenu == `i' } preserve duplicates drop $ancien_revenu, force sort $ancien_revenu global nom proportion_desavantagee_$nouveau_revenu($ancien_revenu) twoway (scatter proportion_desavantagee $ancien_revenu in 1/400), saving(Mes_resultats/$nom.gph, replace) restore /*** FCN Affiche 0 si le nouveau revenu national égale l'ancien (c'est le cas : les définitions sont bonnes) ***/ capture gen nouveau_revenu_pond=pondv*$nouveau_revenu capture replace nouveau_revenu_pond=pondv*$nouveau_revenu capture gen ancien_revenu_pond=pondv*$ancien_revenu capture replace ancien_revenu_pond=pondv*$ancien_revenu sum nouveau_revenu_pond global result1=`r(sum)' sum ancien_revenu_pond global result2=`r(sum)' display $result1-$result2 /*** FCN Trace le nouveau revenu en fonction de l'ancien (la moyenne du nouveau pour chaque tranche de l'ancien) ***/ capture gen nouveau_revenu_moyen = 0 replace $ancien_revenu = round($ancien_revenu,100) forvalues i = 0(100)40000 { quiet:sum nouveau_revenu_pond if $ancien_revenu == `i' quiet:replace nouveau_revenu_moyen = r(sum) if $ancien_revenu == `i' quiet: sum pondv if $ancien_revenu == `i' quiet replace nouveau_revenu_moyen = nouveau_revenu_moyen/r(sum) if $ancien_revenu == `i' } replace $ancien_revenu = round($ancien_revenu,1000) if $ancien_revenu>40000 forvalues i = 40000(1000)200000 { quiet:sum nouveau_revenu_pond if $ancien_revenu == `i' quiet:replace nouveau_revenu_moyen = r(sum) if $ancien_revenu == `i' quiet: sum pondv if $ancien_revenu == `i' quiet replace nouveau_revenu_moyen = nouveau_revenu_moyen/r(sum) if $ancien_revenu == `i' } replace $ancien_revenu = round($ancien_revenu,10000) if $ancien_revenu>200000 forvalues i = 200000(10000)1000000 { quiet:sum nouveau_revenu_pond if $ancien_revenu == `i' quiet:replace nouveau_revenu_moyen = r(sum) if $ancien_revenu == `i' quiet: sum pondv if $ancien_revenu == `i' quiet replace nouveau_revenu_moyen = nouveau_revenu_moyen/r(sum) if $ancien_revenu == `i' } replace $ancien_revenu = round($ancien_revenu,100000) if $ancien_revenu>1000000 forvalues i = 1000000(100000)10000000 { quiet:sum nouveau_revenu_pond if $ancien_revenu == `i' quiet:replace nouveau_revenu_moyen = r(sum) if $ancien_revenu == `i' quiet: sum pondv if $ancien_revenu == `i' quiet replace nouveau_revenu_moyen = nouveau_revenu_moyen/r(sum) if $ancien_revenu == `i' } replace $ancien_revenu = round($ancien_revenu,1000000) if $ancien_revenu>10000000 forvalues i = 10000000(1000000)104000000 { quiet:sum nouveau_revenu_pond if $ancien_revenu == `i' quiet:replace nouveau_revenu_moyen = r(sum) if $ancien_revenu == `i' quiet: sum pondv if $ancien_revenu == `i' quiet replace nouveau_revenu_moyen = nouveau_revenu_moyen/r(sum) if $ancien_revenu == `i' } preserve duplicates drop $ancien_revenu, force sort $ancien_revenu twoway (scatter nouveau_revenu_moyen $ancien_revenu in 1/500), saving(Mes_resultats/$nouveau_revenu($ancien_revenu).gph, replace) restore /*** FCN Détermine le taux d'imposition maximal, la proportion d'avantagés et le revenu seuil (ni avantagé ni désavantagé par la réforme) ***/ preserve duplicates drop $ancien_revenu, force sort $ancien_revenu global seuil 0 forvalues i=20000(100)30000 { quiet:sum nouveau_revenu_moyen if $ancien_revenu == `i' if (r(mean)<`i' & $seuil==0) { global seuil `i' } if (r(mean)>`i') { global seuil2 `i' } } display $seuil /* résultat pour revenu_final_monIR___revenu_final_a: 27700 / revenu_final_monIR___revenu_hors_alloc_a : 25000 */ display $seuil2 /* résultat ___ : 28100 / 25000 */ sum $ancien_revenu global result1 `r(max)' sum $nouveau_revenu if $ancien_revenu==$result1 display r(mean)/$result1 restore quiet:sum pondv if $ancien_revenu<$seuil global result1 `r(sum)' sum pondv if $ancien_revenu<$seuil2 global result2 `r(sum)' quiet:sum pondv display ($result1+$result2)/2/r(sum) /* 44,9% ___ revenu_final_monIR___revenuImposable */ /* 70,9% de la population avantagée pour revenu_final_monIR___revenu_final_hors_alloc_a */ /* 81,3% de la population avantagée pour revenu_final_monIR___revenu_final_a */ /*** Exporte sur excel (qui trace le graphe) la densité de patrimoineXrevenu ***/ // C'est le genre de graphe qui n'est vrai qu'à condition que les 800 000 fichiers aient été bien simulés replace k_isf = round(k_isf,10000) replace k_isf = round(k_isf,100000) if k_isf>300000 replace k_isf = round(k_isf,1000000) if k_isf>2000000 replace k_isf = round(k_isf,10000000) if k_isf>20000000 replace k_isf = round(k_isf,100000000) if k_isf>10000000 replace $r = round($r,2000) replace $r = round($r,10000) if $r>40000 replace $r = round($r,100000) if $r>200000 replace $r = round($r,1000000) if $r>1000000 replace $r = round($r,10000000) if $r>10000000 quiet:tab $r k_isf [iweight=pondv], matcell(x) matrix list x, nonames // Puis Ctrl+C Ctrl+V dans excel, modifier les axes, puis Ctrl+C Ctrl+V en .txt (en mettant le nbr de colonnes en haut à gauche), puis GNUplot : // splot 'C:\Users\Adrien\Desktop\test.txt' matrix nonuniform with lines