Ciao a tutti,
Problemi con il riferimento corretto a una colonna quando si passa il comando <
La sezione di codice con cui ho difficoltà è la seguente:
report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out( Eval( YCols ) ),
In( :Simulated Y )
);
L'esecuzione di quella sezione di codice genera il seguente errore: Colonna da disattivare non trovata. e poi si apre la finestra in cui dovresti selezionare le colonne per entrare e uscire.
Report_of_interest è la finestra del report in cui invio il comando Simulate. Nello specifico a NumberColBox(8), che è la colonna Stima nel report. NBSnum e RSnum sono il numero di campioni bootstrap da eseguire e una variabile seed casuale. Il problema è il nome della colonna nel comando Out() del comando Simulate(). La colonna In() non è un problema perché posso nominare la colonna di dati simulati come voglio, ma la colonna per l'opzione Out() non è una colonna che voglio veramente rinominare o altro. In questo caso, salvo i dati simulati nella tabella dati e rinomino la colonna in "Simulated Y" in modo da potervi fare riferimento come necessario nel comando Simulate come In(:Simulated Y).
All'inizio del codice, all'utente viene richiesto di selezionare la colonna che sarà la colonna di risposta per la modellazione, questa è YCols e spesso, quando si ha a che fare con una colonna in una piattaforma, è possibile impostarla semplicemente come Eval(YCols) e lo accetta bene, ad esempio:
fm = avdt << Fit Model(
Y( Eval( YCols ) ),
Validation( :Validation ),
Effects( :Null Factor, Eval( XCols ) ),
Personality( "Generalized Regression" ),
Run( Fit( Estimation Method( Forward Selection ), Validation Method( Validation Column ) ) )
);
Eseguirà correttamente un modello di adattamento sulla colonna Y( ). Tuttavia, il comando Simulate() vuole che la colonna venga referenziata come colonna con ambito, credo, come vuole che sia, ad esempio :My Column To Model.
Supponiamo che la colonna abbia il nome "La mia colonna da modellare", quindi la variabile YCols e Eval(YCols) restituiranno entrambe quanto segue: {"La mia colonna da modellare"}. Quando si invia il comando di simulazione al report, è necessario il nome della colonna con ambito, come il seguente:
report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out( :My Column To Model ),
In( :Simulated Y )
);
Il problema è che la colonna che sto modellando può cambiare, quindi il suo nome cambia e non voglio rinominare la colonna in modo che abbia sempre un nome fisso come :YData. Desidero lavorare con una variabile come YCols, ma non so come lavorare con l'operatore infisso due punti (:) e una variabile come YCols per avere il riferimento di colonna corretto per il comando Simulate().
Ho provato As Column(dt, name), Column(dt, name), Column(number), Parse(":"||char(Column(avdt, Eval(YCols)))), Parse(":" ||Eval(YCols)[1]) e nessuno di questi funziona. Risultano tutti nello stesso errore menzionato sopra e aprono una nuova finestra per selezionare le colonne da scambiare In/Out, il che annulla l'automazione che sto cercando di fare.
Ogni aiuto è molto apprezzato.
Grazie!,
DS
Ho trovato una possibile soluzione, ma sicuramente non è efficiente ed è piuttosto macchinosa. Immagino che ci siano soluzioni migliori e spero che qualcuno possa aiutarmi.
Ho scoperto che se crei la stringa di invio del comando in JSL e usi Eval(Parse()) per farlo effettivamente, allora funziona. Ancora una volta, è ingombrante e non è efficiente, ma funziona.
str = Eval Insert(
"report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out("
);
str2 = Eval Insert( " ),
In( :Simulated Y )
)" );
Eval( Parse( str || ":" || Char( Eval( YCols )[1] ) || str2 ) );Strana soluzione e spero che qualcuno ne abbia una migliore da condividere.
Grazie!,
DS
Anch'io ho problemi con cose come questa.Potrebbe non essere la soluzione migliore, ma il codice seguente dovrebbe fare quello che vuoi che faccia.*modifica* Vedo che hai già trovato un metodo simile.=)
Eval(
Parse(
"\[report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out( ]\"
|| YCols[1] || "\[ ),
In( :Simulated Y )
);]\"
)
);
Se devo creare un elenco di riferimenti a colonne e Eval non funziona, di solito creo le espressioni e quindi utilizzo Eval(Substitute())
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
cols = {"height", "weight"};
obj = Fit Model(
Y(:weight),
Effects(:age, :sex, :height),
Personality("Generalized Regression"),
Generalized Distribution("Normal"),
Run(
Fit(
Estimation Method(Lasso(Adaptive)),
Validation Method(AICc)
)
)
);
obj << (fit[1] << Save Simulation Formula);
rpt = Report(obj);
out_expr = Expr(Out());
For Each({colname}, cols,
Insert Into(out_expr, Name Expr(AsColumn(dt, colname)));
);
show(out_expr);
Eval(Substitute(
Expr(dtlst = rpt["Parameter Estimates for Original Predictors"][Number Col Box("Prob > ChiSquare")] <<SIMULATE></SIMULATE>CIAO @mmarchandTSI E @jthi ,
Grazie per il feedback e le idee su come risolvere questo problema. Non dovrei essere troppo sorpreso dal fatto che esistano molti modi diversi per risolvere lo stesso problema con JMP/JSL. Una delle grandi cose del software. Tuttavia, trovo interessante che una soluzione "più semplice" non sia possibile. Apprezzo l'aiuto!
Grazie,
DS