Un modo rapido per creare una tabella di valori RsquaredHo uno script che trova il valore Rsquared per un parametro rispetto a molti parametri.Una volta in una tabella è semplice ordinare i valori migliori.Ha funzionato molto bene nel corso degli anni, ma quando provo a spingerlo per trovare il valore per decine di migliaia o più parametri, ci vuole molto tempo.Mi chiedevo se qualcuno conoscesse un modo veloce in JSL per farlo.
Cose che ho provato ma richiedono troppo tempo:
1. Realizzazione di un report bivariato e lettura di Rsq dall'albero di visualizzazione.
xyp = Bivariato (S( colonna (risp)), X( eval (fatto)), Fit Polynomial(gradi), invisibile);
Questo comando funziona effettivamente più velocemente di quanto mi aspetterei, ma il ciclo dell'albero di visualizzazione per ottenere i valori richiede la maggior parte del tempo.
2. Utilizzando Fit Model -> StepWise -> Tutti i possibili modelli di 1 termine.
Questo sembra adattarsi solo a righe di dati che non hanno dati mancanti per tutti i termini e potrei avere molti dati mancanti per alcuni termini.Quindi non soddisfa le mie esigenze.
3. Riassumere i quadrati con una funzione come quella qui sotto.
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 modo rapido per creare una tabella di valori RsquaredGrazie a tutti per il vostro aiuto.Vorrei riassumere qui, solo così c'è un record per i futuri esploratori JMP.
Stavo cercando di trovare un modo per determinare rapidamente tutti i valori R al quadrato di un termine rispetto a molti termini, fino a ~ 100.000 termini.
Nella mia prova stavo adattando 2.000 termini, utilizzando un HP EliteBook con Windows 7, sistema operativo a 64 bit, CPU Intel Core i5-4300U a 190 GHz 2,50 Ghz, 16 GB di RAM.
Il mio metodo originale di 1) eseguire il ciclo di un adattamento bivariato e leggere la R al quadrato dall'albero del display, o 2) i calcoli di forzatura bruta, richiedevano entrambi circa 37 secondi sul mio laptop.Sono circa 30 minuti per 100.000 termini!E voglio farlo per più di un termine di risposta!
Il metodo di utilizzo della piattaforma multivariata ha consumato tutte le risorse del mio computer per circa 15 minuti e poi si è bloccato a causa della memoria insufficiente.Non provarlo a casa.
Il metodo sull'utilizzo di Response Screening di KarenC ha richiesto 1 secondo!Questa è chiaramente la soluzione.Ho contrassegnato una risposta di mikedriscoll come Soluzione solo perché riassume la discussione e mostra il codice da utilizzare.
Per essere completo, ecco il codice che ho usato alla fine.
dt è la mia tabella di dati originale.
resp è una stringa di caratteri che nomina la colonna y di interesse.
fact è un elenco di stringhe di caratteri che denominano le x colonne di interesse.
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 modo rapido per creare una tabella di valori RsquaredPuoi chiamare la piattaforma di Screening della risposta da JSL... da lì le mie competenze JSL non possono aiutarti.
Re: Un modo rapido per creare una tabella di valori RsquaredIn risposta alla tua prima domanda sul mio script, multivariato ha solo le variabili "Y", quindi concateno X e Y e lo lascio calcolare. Non ricordo cosa faccio per la sovrapposizione, ma suppongo di gestirlo in qualche modo.
Lo screening della risposta che Karen ha sottolineato ha molto più senso per quello che stavo cercando di fare.Apparentemente può essere sceneggiato. Eseguilo come test, quindi osserva il triangolo rosso dall'output del rapporto, non la tabella. Il triangolo rosso in alto. Fai clic su salva script -> nella finestra dello script e puoi vederlo. Non so come ottenere il riferimento alla tabella e ai valori r, ma probabilmente otterrei un elenco di tabelle aperte prima dell'esecuzione dello script ... quindi troverò quello nuovo dopo che è stato generato.
Screening della risposta( Y( .... ), X(.... ) )
Re: Un modo rapido per creare una tabella di valori RsquaredSono anche sorpreso che non ci sia una voce "Sorgente" nella nuova tabella di dati.Ti suggerisco di aggiungere una voce nella Wish List di JMP chiedendo che venga aggiunta.
Re: Un modo rapido per creare una tabella di valori RsquaredKaren,
Questo è molto veloce e sembra ottenere tutti i parametri che potrei mai desiderare.
La mia applicazione fa parte di uno script che fa altre cose con i risultati.
Pensi che possa essere sceneggiato?
Sono sorpreso che non ci sia una variabile Source per la tabella.
Re: Un modo rapido per creare una tabella di valori RsquaredMike,
Grazie per la risposta.Ho provato questo.Sta solo registrando la R dei termini comune a tutti i dati?Mi chiedo se sia robusto per colonne di dati non valide.
colpetto
Re: Un modo rapido per creare una tabella di valori RsquaredRecentemente ho utilizzato Analizza> Screening> Resposne Screening (non JSL solo l'interfaccia utente) per ottenere valori RSq.Funziona per uno contro molti parametri o molti contro molti parametri. È veloce. Si ottengono altre informazioni, tuttavia, i valori RSq sono nella tabella pvalue generata. Suggerimento bonus: nella tabella del valore P puoi selezionare righe (coppie di parametri) ed eseguire lo script della tabella "Adatta elementi selezionati" per ottenere adattamenti bivariati. Adoro questo perché voglio sempre vedere una relazione che appare forte numericamente prima di crederci davvero.
Re: Un modo rapido per creare una tabella di valori RsquaredHo uno script che fa più o meno la stessa cosa. Usavo il bivariato, ora uso il multivariato (vedi sottoinsieme dello script di seguito).Di recente ho trovato un bug che non ho ancora risolto, probabilmente con caratteri speciali nel nome della colonna. Ma nel complesso dovrebbe funzionare. Non ricordo se l'ho usato su set di dati così grandi, ma per i dati con cui ho lavorato questo è stato molto più veloce.Nota che per ottenere un # generico di x rispetto a un # generico di y, in realtà sta calcolando per (num_x + num_y) vs (num_x + num_y), che è ancora più veloce del ciclo del bivariato.
Modifica: il metodo di Karen sembra molto più efficiente/elegante di questo. Se mai dovessi aggiornare il mio script, proverei sicuramente quel metodo.
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();