Extrayez la formule de prédiction sans avoir à enregistrer la formule dans la table de données<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'écris un script pour adapter un ensemble de modèles linéaires généralisés à des données, puis j'extrais l'AIC, etc. pour effectuer la moyenne du modèle. En raison de la manière dont JMP code les variables catégorielles dans la matrice de conception pour les modèles linéaires généralisés (JMP utilise un codage somme à zéro plutôt qu'un codage par point d'angle), il est difficile de modéliser la moyenne des prédictions à l'aide des coefficients estimés rapportés dans le fit (l'une des catégories n'est jamais affichée et j'aurais besoin de faire une programmation approfondie pour la recréer). Il semble qu'il serait plus simple d'utiliser simplement la formule de prédiction de la plate-forme, puis d'appliquer les pondérations du modèle à ces prédictions dans une seule grande formule.
Cependant, pour autant que je sache, je dois enregistrer la formule de prédiction dans la table de données pour CHAQUE modèle, puis je peux extraire la formule et la sauvegarder pour l'utiliser ailleurs en utilisant quelque chose du genre
modèle adapté << formule de prédiction ;
modèlepredformula = carboniser ( Colonne ( données , "Formule P(PA)" ) << Obtenir la formule ()) ;
où « Formule P(PA) » est la formule prédite. Je peux ensuite enregistrer la formule de prédiction du modèle (sous forme de caractères) dans mon tableau récapitulatif AIC et éventuellement créer une super formule qui est une somme pondérée des formules individuelles....
Cependant, cela ralentit considérablement le script car les prédictions sont calculées pour l'ensemble du tableau de données et je dois ajouter et supprimer la colonne pour chaque ajustement de modèle.
Alors, existe-t-il un moyen d'extraire la formule de prédiction réelle d'un ajustement de modèle SANS avoir à enregistrer au préalable la colonne dans la table de données et à laisser JMP effectuer les calculs ?
Merci
Carl Schwarz
Re : Extraire la formule de prédiction sans avoir à enregistrer la formule dans la table de donnéesÀ partir de JMP Pro 13.0, il existe un moyen plus simple de " extraire la formule de prédiction réelle d'un ajustement de modèle SANS avoir à enregistrer au préalable la colonne dans la table de données et à laisser JMP effectuer les calculs ? C'est exactement ce que font la « Formule de prédiction de publication » et ses variantes ; la formule générée par l'ajustement du modèle est stockée directement dans une nouvelle plate-forme JMP appelée Dépôt de formule . À partir de là, vous pouvez l'appliquer à d'autres tables (compatibles), générer du code de notation (dans plusieurs langages de programmation) pour le déploiement et lancer des plates-formes JMP telles que le profileur et la comparaison de modèles. Ce dernier a une commande Model Averaging qui, je crois, met en œuvre votre objectif ultime de créer un ensemble.
Malheureusement, la commande Publier n'a pas encore été ajoutée pour la plateforme de modèle linéaire généralisé que vous utilisez. Mais il est disponible pour un bon nombre d'autres plates-formes de modélisation prédictive : neuronale, partition, moindres carrés standard, pour n'en nommer que quelques-unes.
Re : Extraire la formule de prédiction sans avoir à enregistrer la formule dans la table de donnéesoui, pour évaluer dt, c'est juste
dt; ou si vous voulez avoir de la fantaisie, eval(dt);
la fonction open peut accepter plusieurs arguments différents. Dans de nombreux cas, l’ordre des arguments n’a pas d’importance, dans ce cas-ci c’est le cas. inset into ajoute à la fin de la liste des arguments de la fonction, sauf si vous spécifiez qu'il doit aller dans un certain ordre avec le troisième argument que je n'ai pas utilisé ici.
Certes, cela peut paraître vraiment bizarre, mais c'est super pratique.
en encapsulant l'instruction open dans une expression, je peux ajouter ou supprimer des arguments avant qu'elle ne soit évaluée.
insert into ajoute essentiellement ", invisible" sauf que ce n'est pas une chaîne qui doit être analysée.
insert into ajoute le contenu d'invis avec une petite torsion, si je viens d'insérer invis, alors il insérerait l'invis évalué, je ne voulais pas ça, alors j'ai enveloppé invis dans "name expr".name expr(invis) va être évalué comme "invisible" et il ajoute le commun comme séparateur. donc name eval ajoute le texte de l'expression sans qu'il s'agisse jamais de texte.malheureusement, plus j'essaie d'expliquer cela, plus cela semble pire.
en JSL, vous pouvez essentiellement commencer par l'expression d'une fonction vide et la remplir avec toutes les pièces dont vous avez besoin.
Re : Extraire la formule de prédiction sans avoir à enregistrer la formule dans la table de donnéesBien... mais je ne comprends pas vraiment comment le "insert into" sait où insérer l'expression "invis" dans l'expression "dt". Je suppose que Expr "parsea" l'expression pour créer une sorte d'arbre, puis "insérer dans" ajoute simplement l'argument "invis" comme une autre feuille dans l'arbre ?
Je ne comprends pas assez bien comment les arguments sont transmis aux fonctions dans JMP. Je viens d'un arrière-plan R où il est soit positionnel, soit argument = valeur et je trouve que l'utilisation par JMP de choses comme Invisible dans la fonction Open() est un peu bizarre car ce n'est pas une chaîne). Des bonnes références pour cette façon d'appeler des fonctions ?
Je n'ai pas encore essayé, mais je suppose que vous devez évaluer l'expression « dt » pour ouvrir la table de données réelle.
Re : Extraire la formule de prédiction sans avoir à enregistrer la formule dans la table de donnéeslégèrement différent, et pas d'analyse
fonctionne silencieusement = 1 ;
invisible = Expr ( invisible ) ; //ce n'est ni une chaîne ni une liste, et elle n'est pas évaluée
dt = Expr ( Ouvrir ( "$SAMPLE_DATA/Grande Classe.jmp" ) ) ;
Si ( fonctionne silencieusement == 1 , je insérer dans ( dt , Nom Expr ( invisible ) ) ) ; //utilise Name Expr pour renvoyer le symbole de l'expression sans l'évaluer.
Re : Extraire la formule de prédiction sans avoir à enregistrer la formule dans la table de donnéesMerci pour les suggestions... J'ai aussi trouvé
// L'indicateur runsilent ci-dessous est utile pour le débogage. Réglez-le sur 0 pour que tout soit visible. 1 pour courir en silence
fonctionne silencieusement = 0 ;
évaluer ( analyser ( "data = Open( \!"SPPI_ Data_JMP_Revised.jmp\!""|| si ( fonctionne silencieusement , ",\!"invisible\!"" , " " ) || ");" )) ;
Notez que j'ai dû inclure la virgule avec la chaîne ", invisible" pour créer un express qui fonctionne si runsilent=0 afin d'éviter d'avoir des arguments "vides" dans l'appel.
Carl.
Re : Extraire la formule de prédiction sans avoir à enregistrer la formule dans la table de donnéesInvisible est un mot clé donc ce n'est pas si simple à définir comme paramètre.J'utilise généralement simplement les instructions IF :
Ma distribution = Fonction ({ dt , col , faireInvisible } , { Local par défaut } ,
Si ( faireInvisible ,
dt << Distribution ( Invisible , Colonne ( Évaluer ( col ) ) )
,
dt << Distribution ( Colonne ( Évaluer ( col ) ) )
)
) ;
dt = Ouvrir ( "$SAMPLE_DATA/Grande Classe.jmp" ) ;
Ma distribution ( dt , "hauteur" , 1 ) ;
Si vous souhaitez le définir comme paramètre, vous pouvez créer la commande sous forme de chaîne, puis l'analyser et l'exécuter :
Ma distribution = Fonction ({ dt , col , faireInvisible } , { Local par défaut } ,
Si ( faireInvisible ,
mot-clé = "Invisible"
,
mot-clé = ""
) ;
Évaluer ( Analyser ( Insertion d'évaluation ( "\[
dt << Distribution( ^mot-clé^, Colonne( "^col^" ) )
]\" ))) ;
) ;
dt = Ouvrir ( "$SAMPLE_DATA/Grande Classe.jmp" ) ;
Ma distribution ( dt , "hauteur" , 1 ) ;
Re : Extraire la formule de prédiction sans avoir à enregistrer la formule dans la table de donnéesLes rapports de l'ajustement n'apparaissent jamais à l'écran, mais je n'ai jamais explicitement rendu les rapports invisibles. Je vois qu'il existe une option "invisible" pour lancer des ajustements....
Lorsque je précise l'option invisible au lancement de la plateforme, cela réduit le temps de 45 secondes à 30 secondes.
Le tableau de données d'origine est visible (dans lequel les formules de prédiction sont successivement enregistrées) et le tableau de données récapitulatif final (dans lequel les résultats de chaque ajustement de modèle sont successivement ajoutés) sont également visibles. J'ai essayé de rendre la table de données d'origine invisible et cela accélère vraiment les choses (maintenant jusqu'à 15 secondes) même en ajoutant/supprimant les colonnes de prédiction.
Le tableau des résultats finaux a été construit successivement afin que je puisse voir les lignes ajoutées successivement. J'ai également rendu cela invisible et réduit à nouveau le temps à 8 secondes !
Ainsi, le goulot d'étranglement semble être lié aux opérations d'écran plutôt qu'au temps CPU.
Maintenant, les timings révisés (sur le script final accéléré) sont
56 % d'ajustement du modèle
13 % génèrent des rapports de modèles
12% clôturent le rapport modèle (même s'il est invisible ?)
Quand je regarde mon journal, ma ligne
modèle adapté << formule de prédiction ;
a déclenché un message d'avertissement concernant un opérateur booléen manquant. Si je le passe à
modèle adapté << formule de prédiction(1) ;
le script fonctionne toujours correctement sans message d'avertissement. Cependant, je n'arrive pas à trouver de documentation dans la référence de syntaxe JSL ou le guide de script sur ce qu'est un
modèle adapté << formule de prédiction (0) ;
ferait? Je vais essayer d'écrire un petit script pour voir si ce dernier n'évaluerait pas non plus la formule de prédiction.
J'essaie maintenant de modifier le script pour que l'option "invisible" puisse être définie à la volée. Je veux faire quelque chose comme
exécute silencieux = 1 ;
data << open("blah", if(run quiet, "Invisible"));
mais JMP s'arrête toujours à ce moment-là... J'ai toujours du mal à rendre les messages dynamiques lorsque des mots de code "câblés" sont nécessaires. Retour aux livres....
Carl.
Re : Extraire la formule de prédiction sans avoir à enregistrer la formule dans la table de donnéesConcernant les horaires, avez-vous essayé de rendre la fenêtre du rapport « invisible ». Juste curieux de savoir si cela a un impact sur votre chiffre de 23 % ci-dessus.
Re : Extraire la formule de prédiction sans avoir à enregistrer la formule dans la table de donnéesMerci Ian et Dave. Je n'ai trouvé la formule de prédiction nulle part dans l'arborescence ShowProperties, donc je suppose qu'elle n'est pas calculée jusqu'à ce que cela soit demandé par une action de sauvegarde de la colonne.
J'ai essayé mon script avec et sans supprimer l'évaluation de la formule. Sans supprimer la formule, cela a pris 45 secondes. Avec la suppression de la formule, cela a pris 44 secondes. Je suppose que j'avais tort de supposer que l'évaluation de la formule prenait beaucoup de temps par rapport aux ajustements réels du modèle, à l'extraction du rapport et à l'enregistrement des informations dans un nouveau tableau de données (résumé).
Il ne m'est pas venu à l'esprit d'essayer de profiler le script. Je viens de faire ça. Voici les résultats
11% du temps passé au montage des modèles
13% du temps passé à créer les rapports
47 % du temps passé à supprimer la colonne utilisée pour chaque modèle pour les prédictions en utilisant : données << supprimer les colonnes ("Formule P(PA)");
23% du temps passé à fermer la fenêtre du rapport après en avoir extrait les informations en utilisant : modelreport << fermer la fenêtre ;
J'ai trouvé cela surprenant !
Carl
Re : Extraire la formule de prédiction sans avoir à enregistrer la formule dans la table de donnéesFWIW, je pense que Dave a peut-être raison. Il existe des messages « << Get Estimates » et « << Get Variance Components », mais ils ne sont pas toujours disponibles (en fonction de la nature de l'ajustement). Cela vaut peut-être la peine d'utiliser 'ShowProperties()' dans votre cas spécifique pour voir.
Re : Extraire la formule de prédiction sans avoir à enregistrer la formule dans la table de donnéesJe ne suis pas sûr qu'il existe un moyen de faire ce que vous voulez.L'approche que j'adopte consiste à supprimer l'évaluation des formules avant d'enregistrer les formules de prédiction :
dt << Supprimer l'évaluation de la formule (1)