Un moyen rapide de créer un tableau de valeurs RsquaredJ'ai un script qui trouve la valeur Rsquared pour un paramètre par rapport à plusieurs paramètres.Une fois dans un tableau, il est simple de trier les meilleures valeurs.Cela a très bien fonctionné au fil des ans, mais lorsque j'essaie de le pousser pour trouver la valeur de dizaines de milliers de paramètres ou plus, cela prend très longtemps.Je me demandais si quelqu'un connaissait un moyen rapide en JSL de le faire.
Choses que j'ai essayées mais qui prennent toutes trop de temps:
1. Faire un rapport bivarié et lire le Rsq à partir de l'arborescence d'affichage.
xyp = Bivarié (Y( colonne (resp)), X( eval (fait)), Fit Polynomial (degré), invisible);
Cette commande fonctionne en fait plus rapidement que prévu, mais la boucle dans l'arborescence d'affichage pour obtenir les valeurs prend la plupart du temps.
2. Utiliser Fit Model -> StepWise -> All Possible Models of 1 term.
Cela semble ne correspondre qu'aux lignes de données qui n'ont pas de données manquantes pour tous les termes et je peux avoir beaucoup de données manquantes pour certains termes.Il ne correspond donc pas à mes besoins.
3. Résumer des carrés avec une fonction comme celle ci-dessous.
GetRsquared = function ({x,y}, {sx,sy,ssxx,ssyy,ssxy,nr,np,i},
sx=0;
sy=0;
ssxx=0;
ssyy=0;
ssxy=0;
nr=nrows(y);
np=nr;
for( i=1, i<=nr, i++,
if(is missing(x[i]),np--,
if(is missing(y[i]),np--,
sx=sx+x[i];
sy=sy+y[i];
ssxx=ssxx+x[i]*x[i];
ssyy=ssyy+y[i]*y[i];
ssxy=ssxy+x[i]*y[i]
)));
ssxx=ssxx-sx*sx/np;
ssyy=ssyy-sy*sy/np;
ssxy=ssxy-sx*sy/np;
r2=ssxy*ssxy/ssxx/ssyy
);
Re : Un moyen rapide de créer un tableau de valeurs RsquaredMerci à tous pour votre aide.Je voudrais résumer ici, juste pour qu'il y ait un record pour les futurs explorateurs JMP.
J'essayais de trouver un moyen de déterminer rapidement toutes les valeurs R au carré d'un terme par rapport à plusieurs termes, jusqu'à ~ 100 000 termes.
Dans mon essai, j'utilisais 2 000 termes, en utilisant un HP EliteBook avec Windows 7, système d'exploitation 64 bits, processeur Intel Core i5-4300U à 190 GHz 2,50 Ghz, 16 Go de RAM.
Ma méthode originale consistant à 1) boucler un ajustement bivarié et lire le R au carré à partir de l'arbre d'affichage, ou 2) calculs de force brute, les deux ont pris environ 37 secondes sur mon ordinateur portable.C'est ~ 30 minutes pour 100 000 termes !Et je veux le faire pour plus d'un terme de réponse !
La méthode d'utilisation de la plate-forme multivariée a consommé toutes les ressources de mon ordinateur pendant environ 15 minutes, puis s'est écrasée en raison d'une mémoire insuffisante.N'essayez pas ca a la maison.
La méthode d'utilisation de Response Screening de KarenC a pris 1 seconde !C'est clairement la solution.J'ai marqué une réponse de mikedriscoll comme solution uniquement parce qu'il résume la discussion et qu'il montre le code à utiliser.
Pour être complet, voici le code que j'ai utilisé à la fin.
dt est ma table de données d'origine.
resp est une chaîne de caractères désignant la colonne y d'intérêt.
fact est une liste de chaînes de caractères nommant les x colonnes d'intérêt.
dt1 = dt << Response Screening(Y(column(resp)), X(eval(fact)));
// Note: This is not a normal table and JMP will not recognize dt1 as a table
// The 'table' is called "Pvalues". Hopefully you don't already have a table of that name.
// Of course you can write more code to make this error proof.
// To immediately move this information to a normal JMP table I took a subset.
dt2 = Data Table( "PValues" ) << Subset( All rows, Selected columns only( 0 ) );
// Now I can do other things, like ...
dt2 << Sort( By( :RSquare ), Order( Descending ), Replace Table );
rsq = dt2:RSquare<< get as matrix;
Re : Un moyen rapide de créer un tableau de valeurs RsquaredVous pouvez appeler la plate-forme de filtrage des réponses de JSL... à partir de là, mes compétences JSL ne peuvent pas vous aider.
Re : Un moyen rapide de créer un tableau de valeurs RsquaredEn réponse à votre première question sur mon script, multivarié n'a que les variables "Y", donc je concatène les X et les Y et je le laisse le calculer. Je ne me souviens pas de ce que je fais pour le chevauchement, mais je suppose que je le gère d'une manière ou d'une autre.
La sélection des réponses que Karen a soulignée est beaucoup plus logique pour ce que j'essayais de faire.Il peut être scénarisé apparemment. Exécutez-le comme un test, puis regardez le triangle rouge de la sortie du rapport, pas le tableau. Le triangle rouge du haut. Cliquez sur enregistrer le script -> dans la fenêtre de script et vous pouvez le voir. Je ne sais pas comment obtenir la référence à la table et les valeurs r, mais j'obtiendrais probablement une liste des tables ouvertes avant l'exécution du script... puis je trouverais la nouvelle après sa génération.
Dépistage des réponses( Y( .... ), X(.... ) )
Re : Un moyen rapide de créer un tableau de valeurs RsquaredJe suis également surpris qu'il n'y ait pas d'entrée "Source" sur la nouvelle table de données.Je vous suggère d'ajouter une entrée dans la liste de souhaits JMP pour demander son ajout.
Re : Un moyen rapide de créer un tableau de valeurs RsquaredKarine,
C'est très rapide et semble obtenir tous les paramètres que je pourrais souhaiter.
Mon application fait partie d'un script qui fait autre chose avec les résultats.
Pensez-vous que cela peut être scénarisé ?
Je suis surpris qu'il n'y ait pas de variable source pour la table.
Re : Un moyen rapide de créer un tableau de valeurs RsquaredMike,
Merci pour la réponse.J'ai essayé ça.S'agit-il seulement d'enregistrer le R des termes communs à toutes les données ?Je me demande si c'est robuste aux mauvaises colonnes de données.
Tapoter
Re : Un moyen rapide de créer un tableau de valeurs RsquaredRécemment, j'ai utilisé Analyze> Screening> Resposne Screening (pas JSL juste l'interface utilisateur) pour obtenir des valeurs RSq.Cela fonctionne pour un contre plusieurs paramètres ou plusieurs contre plusieurs paramètres. C'est rapide. Vous vous retrouvez avec d'autres informations, cependant, les valeurs RSq sont dans la table pvalue qui est générée. Astuce bonus : dans le tableau des valeurs P, vous pouvez sélectionner des lignes (paires de paramètres) et exécuter le script du tableau "Ajuster les éléments sélectionnés" pour obtenir des ajustements bivariés. J'adore ça car je veux toujours voir une relation qui semble forte numériquement avant d'y croire vraiment.
Re : Un moyen rapide de créer un tableau de valeurs RsquaredJ'ai un script qui fait à peu près la même chose. Utilisé pour utiliser le bivarié, maintenant j'utilise le multivarié (voir sous-ensemble du script ci-dessous).J'ai récemment trouvé un bogue que je n'ai pas encore corrigé, probablement avec des caractères spéciaux dans le nom de la colonne. Mais dans l'ensemble cela devrait fonctionner. Je ne me souviens pas si je l'ai utilisé sur des ensembles de données aussi volumineux, mais pour les données avec lesquelles j'ai travaillé, c'était beaucoup plus rapide.Notez que pour obtenir un nombre générique de x par rapport à un nombre générique de y, il calcule en fait pour (num_x + num_y) vs (num_x + num_y), ce qui est toujours plus rapide que de parcourir la bivariée.
Edit : la méthode de Karen semble bien plus efficace/élégante que celle-ci. Si jamais j'ai besoin de mettre à jour mon script, je vérifierais certainement cette méthode.
numX = nitems(xParamNames);
numy = nitems(yParamNames);
yxParamNames = concat(yParamNames, xParamNames);
mvObj = Multivariate(
// Y(evallist(yParamList)
Y(evallist(yxParamNames)
),
Estimation Method( "Row-wise" ),
Matrix Format( "Square" ),
Scatterplot Matrix(0
)
);
corrMatrixObj = mvObj << xpath( "//OutlineBox[ text() = 'Correlations']//MatrixBox");
corrMatrix = corrMatrixObj << get();
corrMatrix = corrMatrix[1];
corrMatRows = 1::numY;
corrMatCols = (numY+1)::(numY+numX);
sub_corrMatrix = corrMatrix[corrMatRows,corrMatCols];
myRsqr = aslist(power(sub_corrMatrix,2)); // rsqr is corr matrix to the power 2. rest of script expects a list.
mvObj<< closewindow();