2017-08-30 2 views
0

Commencez par les données TOYBOX suivantes:Comment créer DataSet Imite Twoway Tabulate, mais classé dans Way spécial

clear all 
set obs 150 
set seed 1234 
foreach i in 1 2 { 
    gen year`i' = round(runiform()*4) 
    tostring year`i', replace 
    replace year`i' = "AA" if year`i'=="0" 
    replace year`i' = "BB" if year`i'=="1" 
    replace year`i' = "CC" if year`i'=="2" 
    replace year`i' = "DD" if year`i'=="3" 
    replace year`i' = "EE" if year`i'=="4" 
} 

Mon but ultime est de créer une table dans LaTeX qui est très similaire à ce qui résulterait de tab year1 year:

enter image description here

sauf les deux lignes et des colonnes doivent être triées par les résultats d'un onglet oneway de an1:

enter image description here

Donc, ce serait quelque chose comme ceci:

year1 BB DD CC EE AA 
BB  7 7 10 6 9 
DD  10 ... 
CC 
EE 
AA 

L'approche que je envisage actuellement de créer un ensemble de données qui est dans ce format, avec la première chaîne contenant des valeurs variables BB, DD, etc. Ensuite, utilisez texsave ou quelque chose pour exporter l'ensemble de données dans un fichier tex.

Je suis en mesure d'obtenir l'ensemble de données, mais je ne sais pas comment faire le tri dans la façon dont je veux:

contract year1 year2, f(freq) 
reshape wide freq, i(year1) j(year2) string 
foreach i in AA BB CC DD EE { 
    rename freq`i' `i' 
} 

Résultat: enter image description here

Que puis-je faire maintenant sorte il basé sur les résultats de la tabulation à sens unique de year1? Plus précisément, comment puis-je trier year1 de cette façon et de commander les variables AA...EE de cette façon?

Répondre

1

Vous n'avez pas besoin d'un nouvel ensemble de données ici . Ce que vous voulez tabulé ne sont que des mappages un-à-un de vos variables existantes, de la catégorie ayant la fréquence la plus élevée (de la première variable) mappée aux valeurs les plus basses des nouvelles variables, et ainsi de suite. D'où deux nouvelles variables suffiront.

* simpler code for sandbox 
clear all 
set obs 150 
set seed 1234 
foreach i in 1 2 { 
    gen year`i' = word("AA BB CC DD EE", 1 + round(runiform()*4)) 
} 

* main segment 
bysort year1 : gen freq = -_N 
egen YEAR1 = group(freq year1) 
labmask YEAR1, values(year1) 
encode year2, gen(YEAR2) label(YEAR1) 
label var YEAR1 "year1" 
label var YEAR2 "year2" 

tab YEAR1 YEAR2 

      |       year2 
    year1 |  BB   DD   CC   EE   AA |  Total 
-----------+-------------------------------------------------------+---------- 
     BB |   7   7   10   6   9 |  39 
     DD |  10   9   10   6   2 |  37 
     CC |   6   8   9   4   2 |  29 
     EE |   2   3   9   5   5 |  24 
     AA |   2   6   6   2   5 |  21 
-----------+-------------------------------------------------------+---------- 
    Total |  27   33   44   23   23 |  150 

De façon plus détaillée: Une façon de le faire est de créer de nouvelles variables pour la tabulation dans laquelle l'ordre est selon les fréquences de groupe de votre première variable. Ici egen, group() est utile. Torsions sont

  1. Vous voulez d'abord la plus haute fréquence alors que egen, group() créerait une variable de regroupement entier avec catégorie moins cher. Par conséquent, trier sur les fréquences niées. (Ou de manière équivalente, annuler le résultat par défaut de egen, group(). Ceci est une ligne de plus que la solution ci-dessus.)

  2. Il est possible que deux ou plusieurs groupes aient la même fréquence, donc nous devons coder généralement pour rompre les liens.

  3. Vous souhaitez que les étiquettes de valeur de cette variable de regroupement affichent les catégories d'origine.labmask (Stata Journal) est pratique ici: voir this paper for discussion et search labmask, sj pour obtenir un téléchargement.

Une fois la première variable a des étiquettes de valeur, ces étiquettes sont ce que l'on voulait encode la deuxième variable.

Si vous voulez encore un nouvel ensemble de données, puis

contract YEAR? 
1

Une façon - peut-être pas le plus élégant, mais pratique - est de recréer les résultats de votre commande en utilisant tab year1rowtotal() de egen fonction:

egen _s = rowtotal(AA BB CC DD EE) 
gsort -_s 
drop _s