<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>missing-fontions &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/missing-fontions/</link>
	<description>Feed of posts on WordPress.com tagged "missing-fontions"</description>
	<pubDate>Wed, 10 Feb 2010 10:39:41 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Passer d'un fichier de l'ODS TAGSET.EXCELXP à un data set SAS avec PROC IMPORT]]></title>
<link>http://thesasreference.wordpress.com/2008/08/15/proc_import/</link>
<pubDate>Fri, 15 Aug 2008 06:00:18 +0000</pubDate>
<dc:creator>The SAS Reference</dc:creator>
<guid>http://thesasreference.wordpress.com/2008/08/15/proc_import/</guid>
<description><![CDATA[Le programmeur SAS pourra recueillir des informations d&#8217;un non spécialiste en créer un fichier]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><img class="alignnone size-full wp-image-408" src="http://thesasreference.wordpress.com/files/2008/08/cycliste_fr.jpg" alt="" width="448" height="224" /></p>
<p>Le programmeur SAS pourra recueillir des informations d&#8217;un non spécialiste en créer un fichier Excel. Il importe ensuite les données sous SAS.</p>
<p>Dans un précédent sujet &#8220;<a title="sas ods tagset excelxp" href="http://thesasreference.wordpress.com/2008/05/12/ods_tagsets_excelxp_1/">Mes 1ers pas avec ODS TAGSET.EXCELXP</a>&#8220;, nous avons vu comment créer un fichier Excel, ou plutôt un fichier XML lisible sous Excel, à partir de la syntaxe d&#8217;ODS TAGSET.EXCELXP.</p>
<p>Maintenant, il s&#8217;agit de voir les limites de l&#8217;importation d&#8217;un fichier XML avec la procédure PROC IMPORT.</p>
<p><strong>Exemple</strong> : Nous aurons un fichier LST_STUDY.XLS avec plusieurs feuillets, dont un nommé &#8216;2000&#8242;, comme exemple. Ce feuillet a deux colonnes : le numéro de l&#8217;étude (STUDY) et la variable à compléter manuellement (FLAG_EXTERNAL). La première ligne contient le nom de la colonne. La variable STUDY peut contenir des nombres et du texte.</p>
<p><strong><span style="color:#ff6600;">1. PROC IMPORT a besoin de données Excel</span></strong></p>
<p>Même si le fichier créé par ODS TAGSET.EXCELXP a une extension .xls, ce fichier est en fait un fichier en langage XML. Comment observer cette information ? Voici deux propositions :</p>
<ol>
<li>Ouvrez un fichier de ce type sous Excel et regarder le type lors que la fenêtre OUVRIR apparaît.</li>
<li>Ouvrez le fichier dans un éditeur de texte</li>
</ol>
<p>Afin d&#8217;utiliser la procédure PROC IMPORT, il faudra donc convertir le fichier en &#8220;enregistrant sous&#8221; et là choisir le standard Excel.</p>
<p><strong><span style="color:#ff6600;">2. Les options de l&#8217;instruction PROC IMPORT</span></strong></p>
<p><strong>Préciser le nom du fichier d&#8217;entrée et celui de sortie</strong> : Dans l&#8217;instruction PROC IMPORT, le nom du fichier Excel est donné avec l&#8217;option DATAFILE=; celui du data set SAS est introduit par l&#8217;option OUT=. Pour rendre ce data set permanent, le nom de la bibliothèque précédera le nom du data set comme d&#8217;habitude.</p>
<p><strong>Indiquer à SAS le type de fichier à lire</strong> : Selon l&#8217;environnement et la version Excel utilisée, l&#8217;option DBMS= variera. DBMS=XLS est l&#8217;option que j&#8217;utilise sous Unix et Windows pour Excel2003. Reportez-vous à la documentation en ligne (<a title="sas online doc proc import statement" href="http://support.sas.com/onlinedoc/913/getDoc/de/proc.hlp/a000308090.htm">PROC IMPORT Statement)</a> pour connaître toutes les valeurs possibles de cette option.</p>
<p><strong>Remplacer un fichier SAS existant</strong> : Si le data set SAS existe déjà, il ne sera pas remplacé, à moins d&#8217;ajouter l&#8217;option REPLACE.</p>
<p><span style="font-family:Courier New;"><span style="color:#0000ff;">%let</span> resultats = C:/sasref;</span></p>
<p><span style="font-family:Courier New;"><span style="color:#000080;"><strong>proc import</strong></span> <span style="color:#0000ff;">datafile</span> = <span style="color:#800080;">&#8220;&#38;resultats./lst_study.xls&#8221;</span><br />
<span style="color:#0000ff;">            out</span>      = lst_study<br />
<span style="color:#0000ff;">            dbms</span>     = xls<br />
<span style="color:#0000ff;">            replace</span>;<br />
<strong><span style="color:#000080;">run</span></strong>;</span></p>
<p><strong><span style="color:#ff6600;">3. Les Instructions sur les données sources</span></strong></p>
<p>Après avoir vu les options de l&#8217;instruction PROC IMPORT, je vous propose trois instructions supplémentaires de la procédure (SAS Online Doc. : <a title="SAS Online Doc PROC IMPORT" href="http://support.sas.com/onlinedoc/913/getDoc/de/proc.hlp/a000312413.htm">Data Source Statements</a>)</p>
<p><strong>Des noms de variables personnalisés avec GETNAMES=YES</strong> : SAS se sert de la première ligne du fichier Excel pour définir le nom des variables SAS à moins que l&#8217;instruction GETNAMES=NO soit ajoutée.</p>
<p><strong>SAS considère les premières lignes du fichier pour identifier le type des variables sauf si MIXED=YES</strong> : Si on a une combinaison de caractères et chiffres, on peut se retrouver avec des valeurs manquantes. Par exemple, si vous avez une variable année contenant les valeurs 2008, 2007, &#60;2007, il faudra importer les variables sous forme de caractère. L&#8217;instruction MIXED=YES fera le travail pour vous. </p>
<p><strong>Importer une feuille de calcul en particulier</strong> <strong>grâce à SHEET=:</strong> Par défaut, SAS importera la première feuille de calcul disponible dans le fichier Excel. Pour choisir un autre feuillet, son nom est donné entre guillemets dans l&#8217;instruction  SHEET=.</p>
<p><span style="font-family:Courier New;"><span style="color:#0000ff;">%let </span>resultats = C:/sasref;</span></p>
<p><span style="font-family:Courier New;"><strong><span style="color:#000080;">proc import</span></strong> <span style="color:#0000ff;">datafile</span> = <span style="color:#800080;">&#8220;&#38;resultats./lst_study.xls&#8221;</span><br />
            <span style="color:#0000ff;">out</span>      = lst_study<br />
            <span style="color:#0000ff;">dbms</span>     = xls<br />
            <span style="color:#0000ff;">replace</span>;<br />
   <span style="color:#008000;">*getnames = yes;</span><br />
   mixed    = yes;<br />
   sheet    = <span style="color:#800080;">&#8216;2000&#8242;</span>;<br />
<strong><span style="color:#000080;">run</span></strong>;</span></p>
<p>Vous trouverez plus d&#8217;informations sur la procédure PROC IMPORT dans l&#8217;aide en ligne : SAS Online Doc, <a title="sas online doc proc import" href="http://support.sas.com/onlinedoc/913/getDoc/de/proc.hlp/a000332605.htm">The IMPORT Procedure</a>.</p>
<p><strong><span style="color:#ff6600;">4. Une spécificité de l&#8217;ODS TAGSET.EXCELXP à gérer</span></strong></p>
<p>Lors de la création du fichier avec ODS TAGSET.EXCELXP, une ligne est parfois ajoutée après la dernière ligne de saisie. Cette ligne est incluse dans le data set SAS à l&#8217;importation. La raison pour laquelle cette ligne est saisie m&#8217;est inconnue.</p>
<p>Par contre, je vous propose un data step pour vous en débarrasser une fois le data set SAS créé. </p>
<ul>
<li>L&#8217;option END= de l&#8217;instruction SET sert à repérer la dernière ligne d&#8217;observations.</li>
<li>La fonction MISSING permet de ne supprimer la ligne que si notre variable STUDY est vide.</li>
</ul>
<p><span style="font-family:Courier New;"><strong><span style="color:#000080;">data</span></strong> lst_study;<br />
   <span style="color:#0000ff;">set</span> lst_study end=eof;<br />
   <span style="color:#0000ff;">if</span> eof and missing(study) <span style="color:#0000ff;">then delete</span>;<br />
<strong><span style="color:#000080;">run</span></strong>;</span></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Faire des petits avec l'instruction OUTPUT]]></title>
<link>http://thesasreference.wordpress.com/2008/03/01/output/</link>
<pubDate>Sat, 01 Mar 2008 12:16:03 +0000</pubDate>
<dc:creator>The SAS Reference</dc:creator>
<guid>http://thesasreference.wordpress.com/2008/03/01/output/</guid>
<description><![CDATA[  Imaginez devoir créer plusieurs fois le même tableau avec des fréquences, des tests statistiques, ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><img src="http://thesasreference.wordpress.com/files/2008/03/bouchons_fr.jpg" alt="bouchons_fr.jpg" /> </p>
<p>Imaginez devoir créer plusieurs fois le même tableau avec des fréquences, des tests statistiques, etc. Pourquoi plusieurs fois ? Parce que chaque tableau inclus une population différente.</p>
<p><strong><span style="color:#ff6600;">1. Une observation par tableau </span></strong></p>
<p>Dans le cas le plus simple, chaque observation n&#8217;apparaît que dans un seul des tableaux à produire. Une variable identifie le tableau auquel l&#8217;observation est allouée et l&#8217;instruction BY utilise cette variable avec la procédure report ou autre.</p>
<p>Voici un exemple où les données sont publiées par pays dans des tableaux distincts. L&#8217;utilisation d&#8217;une valeur numérique pour le pays est optionnelle mais ajoute de la flexibilité pour trier les données.</p>
<p>proc format;<br />
value cntry<br />
1=&#8217;Chine&#8217;<br />
2=&#8217;Malaisie&#8217;;<br />
run;</p>
<p>proc report data=lab;<br />
by cntry;<br />
columns test cnt;<br />
&#8230;</p>
<p>format cntry cntry.;</p>
<p>run;</p>
<p><span style="color:#ff6600;"><strong>2. Plusieurs tableaux pour une observation</strong></span></p>
<p><strong>Exemple</strong> : maintenant voici deux exemples des essais cliniques pour lesquels une observation peut servir à plusieurs tableaux.</p>
<ul>
<li>Construire un tableau pour la population &#8216;per protocol&#8217;, un pour &#8216;intent-to-treat&#8217; et un pour &#8217;safety&#8217; : un patient valide par protocole est aussi pour l&#8217;analyse de sûreté mais tous les patients valides pour la sûreté ne répondent pas forcément aux critères du protocole.</li>
<li>créer un tableau par zone géographique : un tableau pour tous les pays couverts par l&#8217;étude clinique, un tableau par pays et un par centre dans un pays donné.</li>
</ul>
<p>Dans ces deux cas, une observation peut être utilisée par plusieurs tableaux. La méthode précédente n&#8217;est plus suffisante. Voici la solution que je vous propose :</p>
<ul>
<li><strong>1er tableau </strong>: extraire les observations correspondant au premier tableau en utilisant une condition listant le critère de sélection si besoin.</li>
<li>rendre ces observations uniques en ajoutant une nouvelle variable avec un numéro unique</li>
<li>sauvegarder ces observations dans un jeu de données</li>
<li><strong>2ème tableau </strong>: extraire les observations pour le second tableau</li>
<li>donner un numéro différent à ces observations</li>
<li>ajouter ces observations à celles précédemment sélectionnées</li>
<li><strong>3ème tableau</strong> : etc.</li>
</ul>
<p>Dans l&#8217;exemple qui suit, quatre tableaux différents sont à produits. On intercalera le code suivant entre les procédures format et report mentionnées précédemment.</p>
<p>data lab;<br />
set lab;<br />
grp=1;<br />
output;<br />
if cntry=&#8217;CN&#8217; then<br />
do;<br />
grp=2;<br />
output;<br />
end;<br />
else if cntry=&#8217;MY&#8217; then<br />
do;<br />
grp=3;<br />
output;<br />
end;<br />
if cntr=1 and cntry=&#8217;CN&#8217; then<br />
do;<br />
grp=4;<br />
output;<br />
end;<br />
run;</p>
<p><span style="color:#ff6600;"><strong>3. Créer plusieurs jeux de données</strong></span></p>
<p>L&#8217;instruction OUTPUT dirige, par défaut, les données vers le jeu de données nommé dans l&#8217;instruction DATA. Parfois, il faut créer plusieurs data sets à partir à partir d&#8217;un seul jeu de données. Par exemple, on créera un data set contenant les patients inclus dans l&#8217;étude et un autre ceux exclus. Pour cela, il suffit de nommer les nouveaux jeux de données dans l&#8217;instruction DATA et de rappeler leur nom dans chaque instruction OUTPUT.</p>
<p>data incl excl;<br />
set pat_lst;<br />
if missing (randomno) then output excl;<br />
else output incl;<br />
run;</p>
<p><span style="color:#ff9900;"><strong>4. Créer une variable numérique avec des valeurs continues</strong></span></p>
<p>En combinaison avec une boucle, l&#8217;instruction OUTPUT permet de générer des nombres. Par exemple, j&#8217;ai eu besoin de tester une macro via un data set listant toutes les valeurs ASCII imprimables. Ces valeurs ont un numéro allant de 32 à 126. La fonction BYTE retrouve la valeur ASCII avec ces numéros.</p>
<p>data ascii (drop=i);<br />
do i=31 to 126;<br />
ascii=byte(i);<br />
output;<br />
end;<br />
run;</p>
<p><strong>A</strong><strong>utres lectures </strong>: vous pouvez étendre votre lecture sur l&#8217;instruction DO et DELETE. L&#8217;instruction DO dispose d&#8217;un mot-clé BY. L&#8217;instruction DELETE est, quant à elle, l&#8217;inverse de l&#8217;OUTPUT.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Fini le Moyen-Age pour compter les mots]]></title>
<link>http://thesasreference.wordpress.com/2008/02/20/compter_mots/</link>
<pubDate>Wed, 20 Feb 2008 19:00:12 +0000</pubDate>
<dc:creator>The SAS Reference</dc:creator>
<guid>http://thesasreference.wordpress.com/2008/02/20/compter_mots/</guid>
<description><![CDATA[  Vous avez une variable composée d&#8217;un ou plusieurs mots pour chaque observation, le tout sépa]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><img src="http://thesasreference.wordpress.com/files/2008/02/ulrepforte.jpg" alt="ulrepforte.jpg" /> </p>
<p>Vous avez une variable composée d&#8217;un ou plusieurs mots pour chaque observation, le tout séparé par des espaces, des virgules ou autre. Et vous voulez savoir combien il y a de mots. Avec SAS 9, il est très rapide de trouver le nombre de mots. Avec SAS 8.2, il faut pallier à l&#8217;absence de la fonction <strong>COUNT</strong>. Dans les deux cas, l&#8217;idée est la même : on compte les délimiteurs et on ajoute 1.</p>
<p>Prenons le cas des espaces. Dans un premier temps, on enlève les blancs de début et de fin de chaîne. Puis on enlève les doublons entre les mots. Enfin on compte les espaces restants. Il faudra aussi tenir compte du fait qu&#8217;une observation puisse ne contenir aucune valeur.</p>
<p>Voici les données qui serviront d&#8217;exemple :</p>
<p><span style="font-size:x-small;font-family:Courier New;"><strong><span style="color:#000080;">data</span></strong> ds_orig;<br />
   x=<span style="color:#800080;">&#8216; AB CD GH &#8216;</span>;<br />
<span style="color:#0000ff;">   output</span>;<br />
   x=<span style="color:#800080;">&#8216; &#8216;</span>;<br />
<span style="color:#0000ff;">   output</span>;<br />
   x=<span style="color:#800080;">&#8216;AB &#8216;</span>;<br />
<span style="color:#0000ff;">   output</span>;<br />
<strong><span style="color:#000080;">run</span>;</strong></span></p>
<p><strong><span style="color:#ff6600;">1. Avec SAS 9, un calcul rapide :</span></strong> il faudra faire appel à:</p>
<ul>
<li>
<div>la fonction <strong>STRIP</strong> pour les blancs aux extrémités,</div>
</li>
<li>
<div>la fonction <strong>COMPBL</strong> pour enlever les blancs doublons,</div>
</li>
<li>
<div>la fonction <strong>COUNT</strong>  pour compter le nombre d&#8217;occurrence d&#8217;un caractère donné,</div>
</li>
<li>
<div>la fonction <strong>MISSING</strong> ou un simple = &#8216; &#8216; pour savoir si la chaîne est vide.</div>
</li>
</ul>
<p>Voici un exemple avec des espaces pour délimiteur.</p>
<p><span style="font-size:x-small;font-family:Courier New;"><strong><span style="color:#000080;">data</span></strong> sas9 ;<br />
   <span style="color:#0000ff;">set </span>ds_orig;<br />
<span style="color:#0000ff;">   if</span> x = <span style="color:#800080;">&#8216; &#8216; </span><span style="color:#0000ff;">then</span> nb_mots = <strong><span style="color:#008080;">0</span></strong>;<br />
<span style="color:#0000ff;">   else </span>nb_mots=count(compbl(strip(x)),<span style="color:#800080;">&#8216; &#8216;</span>) + <strong><span style="color:#008080;">1</span></strong>;<br />
<strong><span style="color:#000080;">run</span>;</strong></span></p>
<p><span style="color:#ff6600;"><strong>2. Avec SAS 8.2, il faut contourner l&#8217;absence de la fonction COUNT</strong></span>: il existe plusieurs options dont celle-ci utilisant une boucle<strong> DO WHILE</strong>: </p>
<ul>
<li>
<div>Les fonctions <strong>TRIM</strong> et <strong>LEFT </strong>remplacent la fonction <strong>STRIP</strong>.</div>
</li>
<li>
<div>Les fonctions <strong>COMPLB</strong> et <strong>MISSING</strong> restent valide.</div>
</li>
<li>
<div>Une boucle remplacera la fonction <strong>COUNT</strong>.</div>
</li>
</ul>
<p>On extrait le 1er mot de la chaîne, puis le 2nd, etc. via la fonction <strong>SCAN</strong>. Si la valeur trouvée est une valeur manquante, alors le nombre de mots est égal au nombre du boucles sans valeur manquante, c&#8217;est-à-dire le nombre de boucles actuel moins 1. Le compteur, ici nommé i, est réinitialisé pour arrêter la boucle <strong>DO WHILE</strong>.</p>
<p><span style="font-size:x-small;font-family:Courier New;"><br />
<strong><span style="color:#000080;">data</span></strong> sas8_2;<br />
<span style="color:#0000ff;">   set</span> ds_orig;<br />
<span style="color:#0000ff;">   if </span>missing(x)<span style="color:#0000ff;">then</span> cnt_mots=<strong><span style="color:#008080;">0</span></strong>;<br />
<span style="color:#0000ff;">   else</span><br />
<span style="color:#0000ff;">      do</span>;<br />
         z=compbl(trim(left(x)));<br />
         i=<strong><span style="color:#008080;">1</span></strong>;<br />
<span style="color:#0000ff;">         do </span><span style="color:#0000ff;">until</span> (i=<strong><span style="color:#008080;">0</span></strong>);<br />
<span style="color:#0000ff;">         if</span> missing(scan(z,i,<span style="color:#800080;">&#8216; &#8216;</span>))<span style="color:#0000ff;">then </span><br />
<span style="color:#0000ff;">            do</span>;<br />
               cnt_mots=i-<strong><span style="color:#008080;">1</span></strong>;i=-&#62;<strong><span style="color:#008080;">1</span></strong>;<br />
<span style="color:#0000ff;">               end</span>;<br />
               i=i+<strong><span style="color:#008080;">1</span></strong>;<br />
<span style="color:#0000ff;">            end</span>;<br />
<span style="color:#0000ff;">         drop</span> i z;<br />
<span style="color:#0000ff;">   end</span>;<br />
<strong><span style="color:#000080;">run</span>;</strong><strong> </strong></span></p>
</div>]]></content:encoded>
</item>

</channel>
</rss>
