Variables de chaîne

Les variables de chaîne, en termes simples, sont des variables qui contiennent non seulement des nombres, mais aussi d’autres caractères (éventuellement mélangés à des nombres). Par exemple, l’Enquête sociale européenne stocke des informations sur le pays dans lequel les répondants ont été interrogés dans la variable cntry, qui contient des chaînes telles que « DE », « ES, »LT », etc. Un autre terme souvent utilisé est les variables « alphanumériques », se référant évidemment à l' »alphabet » et donc aux lettres. Mais en fait, une variable de chaîne peut contenir des caractères tels que « \ » ou « – » ou « : »et ainsi de suite — tout ce qu’un clavier peut produire.

La première section se concentrera sur le sujet de la transformation d’une chaîne en variables numériques. La deuxième section présentera d’autres choses que j’ai trouvées utiles. Mais tout d’abord, je vais émettre un…

Avertissement

À partir de la version 14, Stata prend en charge Unicode (UTF-8). Si vous ne savez pas ce que cela signifie, il s’agit de la façon dont les caractères sont codés numériquement sur votre ordinateur. (Vous avez entendu dire que les ordinateurs utilisent des bits, des octets et de tels éléments pour représenter des informations. Si vous tapez et enregistrez un « a », vous ne trouverez pas un « a » sur votre disque dur, mais du code informatique qui est transformé en « a » sur votre écran ou sur l’imprimante.) Unicode est beaucoup plus universel que les codages antérieurs tels que ASCII ou ANSII. Il permet de représenter des tonnes de caractères, y compris de nombreuses langues qui n’utilisent pas les caractères que vous voyez ici (dérivés de l’alphabet latin et dans la plupart des parties identiques à ceux de l’alphabet latin), mais plutôt le cyrillique, le thaï ou autre.

Je n’entrerai pas dans les détails ici, mais je veux juste vous avertir que les nouvelles possibilités de traiter les caractères Unicode ne sont pas couvertes ici. Notez en particulier que pour certaines fonctions de chaîne (telles que substr()), il existe maintenant des fonctions équivalentes pour traiter en particulier les caractères Unicode. Ces fonctions ont des noms composés de u plus la fonction conventionnelle, par exemple usubstr(). Notez que tant que vous vous limitez aux caractères du code ASCII d’origine (quelque chose que j’enseigne et prêche depuis des décennies), il n’y a pas lieu de s’inquiéter. Mais sinon, sachez que certaines choses pourraient fonctionner différemment avec Stata 14.

Par exemple, les umlaute allemands sont représentés différemment dans Stata 13 et Stata 14, ce qui a des conséquences au-delà de l’affichage des caractères. Par exemple, le mot (allemand) für est une chaîne de longueur trois dans Stata 13, mais la longueur de la chaîne est de quatre dans Stata 14. Cela influence également les résultats de fonctions telles que strlen(). Comme strlen() fait référence à la mémoire utilisée (et non au nombre de caractères tels qu’ils apparaissent à l’écran), le résultat de strlen(für) sera également de 4 dans Stata 14 contre 3 dans Stata 13. La nouvelle fonction ustrlen(für), en revanche, donnera 3. En d’autres termes, les fonctions « ustring » se réfèrent au nombre de caractères tels qu’ils apparaissent à l’œil humain, et non à la quantité de mémoire nécessaire.

De la chaîne aux variables numériques

Même si Stata peut gérer des variables de chaîne, il est clair à bien des égards que les variables numériques sont largement préférées. Notamment, la plupart des procédures statistiques n’acceptent tout simplement pas les variables de chaîne. Heureusement, Stata offre des moyens simples de convertir une chaîne en variables numériques (et vice versa).

Variables « String only »

Parfois, les variables string représentent des propriétés. Cela peut être « masculin » et « féminin » (plus « gay », « queer », ou ce que vous voulez, même si cela est encore très rare dans les données des sciences sociales). Ou il pourrait s’agir des codes de pays mentionnés dans l’introduction, c’est-à-dire « DE », « ES », « UK », US »etc. Si vous devez le transformer en une variable numérique, chaque catégorie doit être représentée par un nombre différent. Passer de chaîne à numérique est facile, avec encode étant la commande de votre choix:

encoder cntry, gen(cntrynum)

convertira cntry en une variable numérique, avec les caractères de l’ancienne variable de chaîne comme étiquettes de valeur.

Si, pour une raison quelconque, vous souhaitez convertir une variable numérique en une variable de chaîne, vous pouvez utiliser la fonction complémentaire decode. Sans surprise, Stata exige que la variable numérique soit étiquetée ; ces étiquettes seront utilisées comme des chaînes pour représenter les différentes valeurs.

Nombres « déguisés » en chaînes

Un cas particulier sont les variables où les valeurs numériques sont stockées en tant que variable de chaîne, y compris les cas où les valeurs numériques sont stockées avec certains caractères (non pertinents). La procédure destring offre des moyens de convertir une telle variable en variable numérique, en laissant les valeurs d’origine inchangées (si elles ne sont constituées que de nombres) ou en supprimant les caractères non numériques.

La forme générale de la commande est

destring varname(s), options

avec au moins une option requise. Les options les plus importantes sont:

  • generate(newvarnames): crée de nouvelles variables
  • replace: remplace les anciennes variables)
  • ignore("char1" ): supprime les caractères « char1 », « char2 », etc.
  • force: modifie toutes les variables contenant des caractères non mentionnés dans force en

manquants Sans surprise, Stata propose également la commande tostring qui fonctionne dans l’autre sens.

Transformations de données pour les variables de chaîne

Ce qui suit est une collection assez hétérogène. En particulier, il existe des dizaines de fonctions qui se réfèrent à des variables de chaîne, et je ne couvrirai qu’une sélection très petite et arbitraire.

split

split est une commande qui fonctionne sur une variable de chaîne. Très évidemment, il le divisera en deux ou plusieurs parties; il le fera en créant de nouvelles variables tout en laissant l’ancienne variable inchangée. Il le fait s’il y a quelque chose dans la variable d’origine qui sépare ces parties. Par défaut, ce séparateur est un espace. Ainsi, le fractionnement d’une variable contenant « Joe Brady » donnera lieu à deux nouvelles variables, l’une contenant « Joe » et l’autre contenant « Brady ». Notez que s’il y a une personne nommée « Joe F. Brady », le résultat sera de trois variables.

split name La variable « nom » sera divisée en variables « nom1 », « nom2 », etc., à condition qu’il contienne des blancs, bien sûr. Le nombre de nouvelles variables sera égal au nombre de blancs plus 1.

split name, parse(,) La variable « nom » sera divisée en utilisant des virgules au lieu de blancs comme séparateurs. Vous pouvez indiquer plusieurs séparateurs; de plus, les séparateurs peuvent comporter plusieurs caractères.

split lnum, destring Les parties de « lnum » qui représentent réellement des nombres seront transformées en variables numériques — mais seulement s’il y a des nombres pour une nouvelle variable donnée. Par exemple, si la variable « lnum » vaut « 60 30 » pour un cas et « 50 ab » pour un autre, la nouvelle variable « lnum1 » sera numérique (avec les valeurs 60 et 50) tandis que « lnum2 » sera toujours une variable de chaîne (et alors que la valeur de cette variable sera 30 pour le premier cas, elle sera toujours traitée comme une chaîne)

split lnum, destring force Toutes les nouvelles variables seront numériques. Pourtant, chaque fois qu’une information non numérique apparaît, la valeur sera manquante. Par exemple, si « lnum » vaut « 60 b30 », la valeur de « lnum2 » sera manquante.

split lnum, destring force ignore(abcd) Toutes les nouvelles variables seront numériques. Tous les caractères « a », « b », « c » ou « d » seront supprimés. Ainsi, dans l’exemple précédent, « b30 » sera transformé en « 30 » et le résultat sera bien une variable numérique.

split lnum, generate(ln) La variable « lnum » sera divisée en variables « ln1 », « ln2 » et ainsi de suite.

egen with ends()

Cette fonction extraira une « partie » d’une variable de chaîne (contrairement à la commande split, qui créera autant de nouvelles variables qu’il y a de « parties »). Ce qu’est une pièce est défini par un séparateur. Ironiquement, par défaut, ends() extraira la première partie (ou tête, comme elle est nommée dans le manuel Stata). Dans l’ensemble, il y a trois possibilités:

egen firstname = ends(name) Cela extraira tout ce qui apparaît dans « nom » avant la première occurrence du séparateur, qui par défaut est un espace vide. Cela équivaut à egen firstname = ends(name), head. S’il n’y a pas de séparateur, la chaîne entière contenue dans « nom » réapparaîtra dans « prénom »

egen lastname = ends(name), last Cela extraira tout ce qui apparaît dans « nom » après la dernière occurrence du séparateur. Encore une fois, s’il n’y a pas de séparateur, tout le contenu de « name » sera représenté dans « lastname ».

egen endofname = ends(name), tail Cela extraira tout ce qui apparaît dans « nom » après la première occurrence du séparateur. S’il n’y a pas de séparateur, le résultat sera une chaîne vide.

Le séparateur peut être indiqué par punct(,). Ainsi, egen firstname = ends(name) punct(,) extraira tout ce qui apparaît dans « nom » avant la première occurrence d’une virgule. D’autres séparateurs sont possibles, y compris ceux composés de plusieurs caractères, mais vous ne pouvez pas indiquer plusieurs séparateurs.

strmatch()

Ceci peut être utilisé avec generate/replace. Il recherche un « mot », ou plus exactement une séquence de caractères, comme dans:

gen newvar=strmatch(oldvar, « somecharacters »)

La variable « newvar » aura une valeur de 1 si « oldvar » est constitué de la séquence « somecharacters ». Cependant, si vous recherchez simplement que « somecharacters » apparaisse quelque part dans « oldvar », vous pouvez utiliser

gen newvar=strmatch(oldvar, « *somecharacters * »)

qui cherchera que « somecharacters » apparaisse n’importe où. Écrire

gen newvar=strmatch(oldvar, « *somecharacters »)

fera que Stata recherchera « somecharacters » à apparaître à la fin de « oldvar », peu importe le nombre de caractères précédant « somecharacters ». Bien sûr, "somecharacters*" peut également être utilisé.