Dans un post précédent , J'ai mentionné un nouveau complément JMP qui peut être utilisé pour fractionner les données avant modélisation prédictive . Cet article explique comment cela fonctionne et aborde donc nécessairement le sujet de JMP Scripting Language, ou JSL en abrégé.
C’est un sujet important, alors je veux simplement montrer l’anatomie d’un script JSL qui fait quelque chose d’un peu utile. Ce post suppose que vous avez téléchargé et installé le complément et sont au courant de ce qu'il fait. (Remarque: le téléchargement du complément nécessite une connexion SAS gratuite.)
Si vous sélectionnez l'élément de menu 'View> Add-Ins…' dans JMP 9, le message 'Stratified Split' devrait apparaître dans la liste déroulante. Le choix de cet élément vous donne un lien vers le "Dossier d'accueil" du complément. Le fait de cliquer sur ce lien et de double-cliquer sur "stratifiedSplit.jsl" ouvre le code source dans l'éditeur de JMP. Pour continuer, assurez-vous que vous avez choisi d'afficher les numéros de ligne dans l'éditeur ("Fichier> Préférences", puis sélectionnez "Editeur de script" en tant que "Groupe de préférences").
La JSL peut être déconstruite comme suit:
(1) Lignes 11-13: Les proportions par défaut dans lesquelles les données doivent être fractionnées. Notez qu'un suffixe "0", "1" ou "2" dans un nom indique quelque chose à voir avec les données "Formation", "Validation" ou "Test" (reflétant les valeurs générées dans la colonne d'indicateur aléatoire créée par JMP). .
(2) Lignes 15-29: Une fonction appelée si vous mettez à jour l'une des proportions par défaut, qui vérifie que votre nouvelle valeur est bien comprise entre 0 et 1.
(3) Lignes 31 à 55: L'interface utilisateur - Elle présente toutes les colonnes du tableau de données actuel et vous permet de sélectionner la colonne de réponse. Vous pouvez également remplacer les proportions de division par défaut.

(4) Lignes 58-85: Affiche l'aide dans une nouvelle fenêtre si le bouton 'Aide' de (3) est enfoncé.
(5) Lignes 88-104: S'exécute lorsque le bouton 'OK' de (3) est enfoncé et vérifie si les trois proportions spécifiées correspondent toujours à l'unité. Sinon, (3) s'affiche à nouveau avec les proportions de division par défaut.
(6) Lignes 107-135: Vérifie qu'une colonne de réponse a bien été sélectionnée et s’arrête sinon. Si une colonne de réponse a été sélectionnée, recherche le nombre de niveaux distincts dans cette colonne et, si ce nombre est supérieur à 100, permet d'arrêter.
(7) Lignes 138-182: L'utilisation d'un mappage des lignes de la table en cours correspondant au niveau de la colonne de réponse (6) et des proportions de division spécifiées (3) permet de créer la nouvelle colonne de validation. Utilise ensuite Distribution pour montrer comment les lignes du tableau ont été fractionnées de manière aléatoire.
Pour ceux qui sont déjà familiarisés avec JSL, le code ici est sans particularité. À un niveau supérieur, cependant, il y a toujours des décisions de conception à prendre, et un compromis est généralement nécessaire lorsque l'on tient compte du résultat final qui doit être "juste assez bon" pour l'usage auquel il est destiné.
Dans ce cas, par exemple, un choix spécifique a été fait pour séparer le contrôle d'erreur en deux parties - (2) et (5) ci-dessus - afin de simplifier la logique derrière l'interface utilisateur. Même si vous êtes nouveau dans JSL, avec un peu de patience et l'aide du Guide de JSL ('Aide> Livres> Guide de script'), vous devriez être en mesure de comprendre le détail du fonctionnement de chaque section de code. Après tout, l’un des meilleurs moyens de commencer à apprendre une nouvelle langue est de partir de quelque chose qui fonctionne. Pour des raisons d'espace, nous ne regarderons ici que (6) et (7).
Comme nous l’avons déjà mentionné, l’un des éléments clés de ce problème consiste à rechercher les niveaux dans la colonne Réponse (6). Bien qu'il existe de nombreuses façons de le faire, le tableau associatif est le plus polyvalent.
Le fragment de code présenté ci-dessous constitue une table pour jouer. La ligne 5 récupère les 20 valeurs de 'Response' dans un vecteur et la ligne 6 construit un tableau associatif et lui envoie un message 'Get Keys' pour révéler les valeurs distinctes dans l'ordre lexicographique. L'un des avantages du tableau associatif est qu'il fonctionne avec tous les types de données (pas seulement les nombres, comme dans ce cas), mais notez que 'Get Keys' renvoie toujours une liste. Donc, à la ligne 7, nous devons utiliser 'N Items ()' pour savoir combien d'éléments cette liste contient.

Une fois que nous avons les valeurs pour 'yLev' et 'nLevs' de (6), les étapes de (7) sont les suivantes:
1. Construisez un vecteur de valeurs manquantes, «vVals», qui sera utilisé par la suite pour remplir la nouvelle colonne de validation (ligne 141).
2 Boucle sur les niveaux distincts contenus dans «yLev» (lignes 143 à 161).
3 Recherchez les numéros de ligne dans 'yVals' (et donc le tableau de données) correspondant au niveau actuel et stockez-les dans la variable 'strate' (ligne 145). Notez ici que la syntaxe à faire dépend de si "yVals" est un vecteur ou une liste (et donc de savoir si la colonne de réponse d'origine avait un type de données "Numérique" ou "Caractère").
4 La variable 'stratumN' contient le nombre de lignes correspondant au niveau actuel (ligne 147). Convertissez les proportions de partage spécifiées en nombres entiers et assurez-vous que leur somme est définie sur "stratumN" (lignes 149 à 154).
5 Construisez les vecteurs "v0", "v1" et "v2" de longueurs correctes et contenant les valeurs "0", "1" et "2" respectivement (lignes 157 à 159). Notez que pour que l’étape suivante fonctionne toujours, nous devons prévoir la possibilité que l’une des proportions soit égale à 0,0 et définir le vecteur correspondant sur '[]'.
6 Empilez ces vecteurs (en utilisant 'VConCat ()'), et mélangez le résultat de sorte que les valeurs '0', '1' et '2' soient distribuées de manière aléatoire. Attribuez ces valeurs aux lignes correctes dans 'vVals' afin que les valeurs manquantes soient remplacées (ligne 160).
7. Une fois la boucle terminée, utilisez 'vVals' pour créer une nouvelle colonne de validation ou remplacer une colonne de validation existante (lignes 163 à 170). Notez que nous utilisons une propriété de colonne "Label de valeur" de sorte que les valeurs entières de "0", "1" et "2" apparaissent respectivement sous "Formation", "Validation" et "Test".
8 Utilisez "Distribution" avec une variable "By" pour afficher les valeurs de la colonne de validation pour chaque niveau de la réponse.
Bien que de routine, il y a peut-être quelques aspects non évidents dans le code:
• Nous n'avons pas émis d'hypothèses inutiles sur le type de données ou le type de modélisation de la colonne de réponse sélectionnée (le code fonctionnerait parfaitement, par exemple, avec une colonne "Numérique", "Continue" contenant des valeurs " groupés 'dans les niveaux).
• Les valeurs manquantes dans la colonne de réponse se propagent en tant que valeurs manquantes à la colonne de validation générée, ce qui est souhaitable. Mais notez que, dans le cas d'une colonne numérique, le '.' La valeur générera une alerte JMP bénigne lorsque la plateforme de distribution essaiera de traiter le groupe "Par" avec le "." valeurs. Pour une colonne de caractère, la chaîne vide "" est traitée de la même manière que les autres niveaux du groupe "Par" sans alerte.
• L'expression 'ColListBox ()' de la ligne 42 ne présente pas les colonnes Row State pour la sélection, même si elles existent dans la table, ce qui est souhaitable dans ce cas.
Si vous utilisez JMP et aimez bricoler avec du code, il existe de nombreuses façons d'en apprendre davantage. Vous pourriez commencer par regarder ceci Entrée d'échange de fichiers .