2017-08-14 2 views
0

J'essaie de créer un fichier Excel automatisé qui documente le nombre d'observations perdues pendant la construction de mon exemple, en utilisant putexcel et un programme simple. Je suis novice en programmation, mais le programme ci-dessous fait l'affaire. Il stocke 4 macros globales pour chaque fois que je laisse tomber quelques observations: 1) Nombre d'observations abandonnées, 2) Part des observations abandonnées, 3) Nombre d'observations laissées dans l'ensemble de données et 4) une chaîne qui explique pourquoi je laisse tomber les observations.Programmation Stata et boucle putexcel

Pour exporter les résultats vers Excel, j'utilise la commande putexcel - qui fonctionne correctement. Le problème est que j'ai besoin de laisser tomber des observations beaucoup de fois dans le fichier et je me demandais si je pouvais intégrer la partie putexcel dans le programme pour le faire boucler sur les cellules. En d'autres termes, ce que je veux, c'est que le programme sauvegarde automatiquement la description ($ why) dans A1 la première fois, dans A8 la deuxième fois et ainsi de suite.

J'ai fourni un exemple de mon code ci-dessous:

** Generate some data: 
clear 

input id year wage 
1 1 200 
1 2 250 
1 3 300 
2 1 152 
2 2 150 
2 3 140 
3 1 300 
3 2 320 
3 3 360 
end 

** Define program 
cap program drop dropdata 
program define dropdata 
    count 
    global N = r(N) 
    count if `1' 
    global drop = r(N) 
    global share = ($drop/$N) 
    drop if `1' 
    count 
    global left = r(N) 
    global why = "`2'" 
end 

** Drop if first year 
dropdata year==1 "Drop if first year" 

** Export to excel 
putexcel set "documentation.xlsx", modify 
putexcel A1 = ("$why") 
putexcel A3 = ("Obs. dropped") A4 = ("Share dropped") A5 = ("Observations left") 
putexcel B3 = ($drop) B4 = ($share) B5=($left) 

** Now drop if wage is < 300 
dropdata wage<300 "Drop if wage<300" 

putexcel A8 = ("$why") 
putexcel A10 = ("Obs. dropped") A11 = ("Share dropped") A12 = ("Observations left") 
putexcel B10 = ($drop) B11 = ($share) B12 = ($left) 

Répondre

1

Le problème avec ce que Stata ne sait pas ce que les cellules sont remplies et qui ne sont pas, donc je pense que ce serait probablement plus facile d'inclure un autre argument dans votre program define qui indique le nombre de fois que vous avez exécuté le programme.

Voici un exemple:

** Generate some data: 
clear 

input id year wage 
1 1 200 
1 2 250 
1 3 300 
2 1 152 
2 2 150 
2 3 140 
3 1 300 
3 2 320 
3 3 360 
end 

** Define program 
cap program drop dropdata 
program define dropdata 
    count 
    local N = r(N) 
    count if `1' 
    local drop = r(N) 
    local share = ($drop/$N) 
    drop if `1' 
    count 
    local left = r(N) 
    local why = "`2'" 

    local row1 = `3'*7 + 1 
    local row3 = `row1' + 2 
    local row4 = `row1' + 3 
    local row5 = `row1' + 4 
    putexcel set "documentation.xlsx", modify 
    putexcel A`row1' = ("`why'") 
    putexcel A`row3' = ("Obs. dropped") A`row4' = ("Share dropped") A`row5' = ("Observations left") 
    putexcel B`row3' = (`drop') B`row4' = (`share') B`row5' = (`left') 


end 

** Drop if first year 
dropdata year==1 "Drop if first year" 0 

** Now drop if wage is < 300 
dropdata wage<300 "Drop if wage<300" 1 

Notez que le changement est d'inclure le nombre d'appels déjà fait le troisième argument en dropdata, puis on ajoute les commandes putexcel aux lignes en fonction de ce nombre.

En aparté:

j'ai changé tous vos globals locaux parce qu'ils sont plus sûrs. De plus, en général, si vous voulez retourner des macros à partir d'un programme que vous écrivez, vous dites Stata le programme est, par exemple un rclass et ensuite utiliser des déclarations comme ci-dessous:

program define return_2, rclass 
    return local asdf 2 
end 

et vous pouvez accéder à la section locale asdf (qui est égal à 2) comme le r(asdf) local et vous pouvez vérifier les valeurs de tous les locaux retournés par le programme avec la commande return list