créer une formule pour générer des colonnes de matrice de conception<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Je débute dans l'utilisation de JMP et je ne trouve pas de réponses similaires à mes questions dans la communauté JMP. Supposons que j'ai une table de données avec plusieurs colonnes et que l'utilisateur doit sélectionner la colonne dans la table de données, puis une matrice de conception sera générée en fonction de la colonne sélectionnée. La colonne sélectionnée et la matrice de conception seront créées dans une nouvelle table de données. Mais ce n'est pas assez. Si l'utilisateur souhaite modifier la valeur de la colonne sélectionnée dans la nouvelle table de données, la matrice de conception sera mise à jour en conséquence. Mon problème est que je ne peux pas mettre à jour correctement la matrice de conception avec le code ci-dessous :
// crée une fenêtre pour sélectionner la colonne
// omettre du code pour créer la fenêtre
CheckEtConvert = Expr(
selectedColumns = c << Obtenir les éléments ;
// Si les entrées sont valides, nous continuons
Si (N éléments (colonnes sélectionnées)> 0,
gagner << Fermer la fenêtre ;
A = Colonne (colonnes sélectionnées);
s = A << GetAsMatrix ; // extrait la colonne select en s
// crée la nouvelle table de données "Design Matrix"
dt = Nouveau tableau("Matrice de conception");
dt << New Column("slice", Numeric, Values(s[0, 1])); // copie s dans la colonne "slice" dans la nouvelle table de données
// créer les colonnes correspondantes de la matrice de conception et les ajouter dans la nouvelle table de données
Pour( i=1, i<=Col Max(dt:tranche), i++,
dt << Nouvelle Colonne("X"||Car(i), Numérique,
Après la dernière,
Formule(
Si(dt:tranche == je, 1,
0
)
)
);
);
);
);
PS : Je peux obtenir la bonne réponse lorsque j'exécute le code sans modifier la valeur dans la colonne slice, mais je ne peux pas mettre à jour les colonnes X si je modifie la valeur de slice. Notez que le nombre de colonnes X est la valeur maximale dans la colonne de tranche, qui n'est pas fixée avec des valeurs différentes. Dans les images suivantes, je montre les exemples pour sélectionner la colonne 1 et la colonne 2 dans les données de test.
Merci d'avance,
Pulong
Re : créer une formule pour générer des colonnes de matrice de conceptionMes excuses. J'ai relu votre demande et réalisé qu'aucune des fonctions JSL n'aidera dans ce cas. Ils sont destinés à créer les colonnes des effets des facteurs catégoriels pour la régression linéaire.
Voici un script qui prendra la matrice avec les niveaux de facteur et créera la matrice avec une colonne pour chaque terme dans un polynôme quadratique :
Names Default to Here( 1 );
x2fx = Function( { x }, { n factors, n treat, fx, f, f1, f2 },
n factors = N Col( x );
n treat = N Row( x );
fx = J( n treat, 1, 1 );
For( f = 1, f <= n factors, f++,
fx ||= x[0,f];
);
For( f1 = 1, f1 < n factors, f1++,
For( f2 = f1+1, f2 <= n factors, f2++,
fx ||= x[0,f1] :*</img> x[0,f2];
);
);
For( f = 1, f <= n factors, f++,
fx ||= x[0,f]^2;
);
fx;
);
X = [1 10,
2 20,
3 10,
4 20,
5 15,
6 15];
D = x2fx( X );
Show( D );
Il n'est pas si difficile de créer vos propres fonctions.
Re : créer une formule pour générer des colonnes de matrice de conceptionVeuillez consulter Aide > Index des scripts. Changez de navigateur pour afficher les fonctions. Sélectionnez ensuite le groupe de fonctions Matrix. Vous trouverez ici plusieurs fonctions pour faire la matrice de modèle (pour les termes) à partir de la matrice de conception (niveaux de facteurs).
Re : créer une formule pour générer des colonnes de matrice de conception
Je pense que j'ai une question similaire - sinon identique -.
Je souhaite créer une matrice de conception à partir de variables prédictives similaires à x2fx dans Matlab.
Par exemple : en sélectionnant des variables prédictives et en spécifiant le type de conception (interactions de 2e ordre), puis en générant la table de conception.
Voir l'exemple de Matlab ci-dessous : (mais je veux le faire dans JMP).
Exemple 1
Ce qui suit convertit 2 prédicteurs<FONT face="Courier New" size="3"> X1</FONT> et<FONT face="Courier New" size="3"> X2</FONT> (les colonnes de<FONT face="Courier New" size="3"> X</FONT> ) dans une matrice de conception pour un modèle quadratique complet avec des termes<FONT face="Courier New" size="3"> constant</FONT> ,<FONT face="Courier New" size="3"> X1</FONT> ,<FONT face="Courier New" size="3"> X2</FONT> ,<FONT face="Courier New" size="3"> X1.*X2</FONT> ,<FONT face="Courier New" size="3"> X1.^2</FONT> , et<FONT face="Courier New" size="3"> X2.^2</FONT> .
X = [1 10
2 20
3 10
4 20
5 15
6 15];
D = x2fx(X,'quadratic')
D =
1 1 10 10 1 100
1 2 20 40 4 400
1 3 10 30 9 100
1 4 20 80 16 400
1 5 15 75 25 225
1 6 15 90 36 225 Re : créer une formule pour générer des colonnes de matrice de conceptionJ'apprécie vraiment votre aide.
J'ai déjà trouvé une solution à mon problème aujourd'hui.
Re : créer une formule pour générer des colonnes de matrice de conceptionD'accord merci beaucoup.
Il semble donc que la pièce manquante soit de pouvoir modifier les cellules d'une colonne (numérique) dans une fenêtre de rapport, auquel cas vous pouvez utiliser 'NumberColEditBox()'. Pour une colonne de caractères, vous pouvez utiliser 'StringColEditBox'. En combinant les deux, vous pouvez présenter n'importe quelle table dans une fenêtre d'éditeur que votre code contrôle (bien que je suppose que vous auriez besoin d'ignorer l'état de la ligne et les colonnes d'expression):
NomsDefaultToHere ( 1 ) ;
// Utilise une colonne numérique
dt = Ouvrir ( "$SAMPLE_DATA/Grande classe.JMP" ) ;
cName = "hauteur" ;
cVals = Colonne ( dt , cName ) << getValues ;
// interface utilisateur
nouveau = Nouvelle fenetre ( "Modifier les cellules" , ceb = NombreColEditBox ( cName , cVals ) , ButtonBox ( "Mise à jour" , mettre à jour les cellules )) ;
// Mettre à jour le script
mettre à jour les cellules =
Expr (
nouveau << Fermer la fenêtre ;
nouveauVals = ceb << getAsMatrix ;
dt << Commencer la mise à jour des données ;
Colonne ( dt , cName ) << setValues ( nouveauVals ) ;
dt << EndDataUpdate ;
) ;
Re : créer une formule pour générer des colonnes de matrice de conceptionMerci pour votre réponse. Votre compréhension du flux de travail est précisément ce que je fais.
Concernant "Définir la tranche":
J'ai déjà conçu la fenêtre pour accomplir cette tâche.
Concernant "Mettre à jour la tranche":
La difficulté réside dans la mise à jour automatique quelle que soit la modification que l'utilisateur apportera. Je peux générer la matrice de conception, mais je ne sais pas comment mettre à jour automatiquement la matrice de conception si l'utilisateur apporte des modifications à la colonne de tranche. De plus, si je sais mettre à jour automatiquement la matrice de conception, ce ne sera pas un problème de générer automatiquement d'autres colonnes basées sur la matrice de conception en modifiant un peu le code.
Merci,
Pulong
Re : créer une formule pour générer des colonnes de matrice de conceptionUn grand merci pour votre explication plus détaillée. Peut-être puis-je le répéter en d'autres mots pour être sûr d'avoir compris?
Supposons que la première table (contenant toutes les tranches possibles) s'appelle dt0. En pensant à vos étapes clés ci-dessus :
- L'utilisateur sélectionne une colonne (une tranche) dans dt0 et crée une nouvelle table (appelez ceci dt1) contenant uniquement cette tranche, plus les colonnes de la matrice de conception (plus les autres colonnes dérivées que vous mentionnez, mais n'épelez pas) .
- Vous souhaitez que l'utilisateur puisse ultérieurement modifier la colonne de tranche dans dt1 et que les autres colonnes de dt1 soient mises à jour "automatiquement".
J'imagine que votre complément final aurait deux options de menu : "Définir la tranche" et "Mettre à jour la tranche". Si ma description de 1. ci-dessus est correcte, ce script 'Design Slice' est facilement obtenu en modifiant le code que j'ai déjà suggéré : la table dt1 pourrait être placée dans un dossier partagé afin que d'autres puissent l'obtenir, et vous pouvez ajouter n'importe quoi métadonnées que vous voulez à la table ou aux colonnes qu'elle contient.
Le script 'Update Slice' peut présenter à l'utilisateur toutes les tables disponibles dans le dossier partagé et lui permettre d'en sélectionner une. À ce stade, cependant, ils ne modifieraient pas directement le tableau : ils se verraient plutôt présenter une fenêtre de rapport leur permettant de modifier les valeurs de la colonne de tranche dans le tableau. Ici, "modifier" peut signifier mettre à jour des valeurs existantes ou ajouter de nouvelles lignes. Lorsqu'ils cliquent sur OK dans ce rapport pour signifier qu'ils sont satisfaits, dt1 peut être automatiquement mis à jour pour refléter toutes leurs modifications, et vous pouvez également mettre à jour les métadonnées si nécessaire. Bien sûr, ce code de « mise à jour » serait commun avec « Définir la tranche ».
Sauf si j'ai mal compris, il semble que ce flux de travail serait raisonnable, peut-être même mieux que de donner aux utilisateurs un accès gratuit à dt1 lui-même.
Re : créer une formule pour générer des colonnes de matrice de conceptionComme c'est la première fois que j'utilise JMP, je vais essayer de décrire mon problème dans le langage de script JMP. En bref, j'ai une table de données, dans laquelle il existe une colonne "tranche", et je veux générer la matrice de conception basée sur la colonne de tranche, et également générer d'autres colonnes basées sur la matrice de conception. Ce que je dois faire, c'est développer un complément JMP qui implémente cette tâche, afin que d'autres collègues puissent également utiliser mon complément pour des expériences informatiques.
Tout d'abord, je voudrais développer une fenêtre pour sélectionner la colonne de tranche et générer une table de données comprenant la colonne de tranche et la matrice de conception, et enregistrer la formule pour mettre à jour automatiquement la matrice de conception si certaines valeurs de la colonne slice sont modifiées ultérieurement . (Je dois enregistrer la formule , car mon chef de projet l'a demandé, mais je pourrais le convaincre sans utiliser les colonnes de formule si je trouve une meilleure solution.)
Maintenant, je peux créer la fenêtre et générer la table de données qui inclut la colonne tranchée et la matrice de conception, mais la matrice de conception ne peut pas être mise à jour si je modifie les valeurs dans la colonne de tranche.
Concernant la colonne en tranches :
Je sais que la fonction de conception dans JMP peut générer automatiquement la matrice de conception, mais ce n'est pas utile si je veux des colonnes de formules. J'ai donc écrit ma propre fonction pour générer ma matrice de conception, comme indiqué dans mon script. Supposons que j'ai la colonne de tranche a = [1, 1, 2, 3]'. Ensuite, la matrice de conception sera générée comme
1 0 0
1 0 0
0 1 0
0 0 1.
La colonne en tranches peut être grande et il est donc difficile de savoir combien de colonnes la matrice de conception aura en regardant manuellement la colonne en tranches. De plus, les valeurs de la colonne sliced peuvent être modifiées arbitrairement.
Je pense que les étapes clés pour créer générer la matrice de conception sont les suivantes :
1. sélectionnez la colonne en tranches, cliquez sur le bouton "OK", puis un nouveau tableau sera généré, qui comprend la colonne en tranches et la matrice de conception. Bien entendu, cette étape implique une intervention manuelle.
2. Si je modifie manuellement certaines valeurs de la colonne slice du nouveau tableau, la matrice de conception d'origine sera automatiquement supprimée et la nouvelle matrice de conception correspondante sera générée.
Deuxièmement, je dois également générer des colonnes basées sur la matrice de conception, et j'ai également écrit le script pour les générer, mais je ne sais pas comment les enregistrer en tant que colonnes de formules. Ce problème ne sera pas un problème si je sais comment enregistrer les colonnes de formule pour la matrice de conception.
Enfin, si je réussissais à créer la matrice de conception et certaines colonnes, je les conditionnerais en tant que complément et les testerais dans de nombreuses circonstances différentes.
Merci pour votre suggestion. Faites-moi savoir si je me fais comprendre.
Pulong
Re : créer une formule pour générer des colonnes de matrice de conceptionJe peux certainement me tromper (selon la généralité dont vous avez besoin pour votre solution), mais il ne me semble pas que les colonnes de formules soient la meilleure façon d'essayer cela. Le fait qu'une colonne de votre table source correspond (généralement) à plusieurs colonnes, et le fait que le nombre de ces colonnes corresponde au nombre (variable) de niveaux dans la colonne source rendent cela difficile.
Avant d'offrir une autre suggestion, peut-être pourriez-vous décrire le flux de travail que vous envisagez un peu plus en détail, s'il vous plaît ? Indiquez également les étapes qui impliquent une intervention manuelle.
Re : créer une formule pour générer des colonnes de matrice de conceptionMerci pour votre aide.
J'ai besoin de générer une matrice de conception à partir d'une colonne, afin de pouvoir également mettre à jour la matrice de conception si les valeurs de la colonne sont modifiées. En fait, je souhaite créer une formule pour générer la matrice de conception basée sur les colonnes sélectionnées et enregistrer la formule afin de pouvoir mettre à jour la matrice de conception si certaines valeurs des colonnes sélectionnées sont modifiées.
Dans mon code, la matrice de conception est générée, mais je ne peux pas obtenir la matrice de conception mise à jour si je modifie certaines valeurs dans la colonne sélectionnée, ce qui est le problème avec lequel je me bats. J'apprécie vraiment si vous pouviez fournir des suggestions sur mon problème.
Merci,
Pulong
Re : créer une formule pour générer des colonnes de matrice de conceptionJe ne savais pas exactement ce que vous cherchiez. Mais étant donné que vous débutez avec JMP, le code ci-dessous peut vous donner quelques idées.
NomsDefaultToHere ( 1 ) ;
// Tableau de test
dt = NouveauTable ( "Test" ,
NouvelleColonne ( "C1" , Numérique , Continu , Formule ( Entier aléatoire ( 1 , 5 ))) ,
NouvelleColonne ( "C2" , Numérique , Continu , Formule ( Entier aléatoire ( 1 , 5 ))) ,
NouvelleColonne ( "C3" , Numérique , Continu , Formule ( Entier aléatoire ( 1 , 5 ))) ,
Ajouter des lignes ( dix )
) ;
// interface utilisateur
Nouvelle fenetre ( "Mettre à jour la conception" ,
Panneau électrique ( "Choisissez une colonne pour voir le design" ,
lubrifier = LineUpBox ( sous-col ( 2 ) ,
club = ColListBox ( dt , Tous , Numérique , MaxItems ( 1 ) , Éléments Min ( 1 ) , scriptclb ) )
)
) ;
// Script pour mettre à jour dynamiquement la line up box lb en fonction de la sélection dans clb
scriptclb =
Expr (
// Récupère les valeurs de la colonne sélectionnée
vals = Colonne ( dt , club << getSelected ) << getAsMatrix ;
// Supprime toute boîte de matrice existante
Essayer ( Mo << supprimer ) ;
// Récupère la matrice de conception dans une boîte de matrice
Mo = MatrixBox ( Conception ( vals )) ;
// Ajoute la nouvelle boîte de matrice
lubrifier << ajouter ( Mo ) ;
) ;