JSL은 열의 올바른 참조를 도와줍니다.안녕하세요 여러분,
JSL을 사용하여 보고서 창에 <<시뮬레이트 명령을 전달할 때 열을 올바르게 참조하는 데 문제가 있습니다.
내가 어려움을 겪고 있는 코드 섹션은 다음과 같습니다.
report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out( Eval( YCols ) ),
In( :Simulated Y )
);
해당 코드 섹션을 실행하면 다음 오류가 발생합니다. 전환할 열을 찾을 수 없습니다. 그런 다음 전환할 열을 선택해야 하는 창이 팝업됩니다.
Report_of_interest는 Simulate 명령을 보내는 보고서 창입니다. 특히 보고서의 Estimate 열인 NumberColBox(8)에 해당됩니다. NBSnum 및 RSnum은 실행할 부트스트랩 샘플 수와 임의 시드 변수입니다. 문제는 Simulate( ) 명령의 Out( )에 있는 열 이름입니다. In( ) 열은 시뮬레이션된 데이터 열의 이름을 원하는 대로 지정할 수 있으므로 문제가 되지 않지만 Out( ) 옵션의 열은 실제로 이름을 바꾸려는 열이 아닙니다. 이 경우 시뮬레이션된 데이터를 데이터 테이블에 저장하고 열 이름을 "Simulated Y"로 변경하여 Simulate 명령에서 필요에 따라 In(:Simulated Y)로 참조할 수 있습니다.
코드 앞부분에서는 모델링을 위한 응답 열이 될 열(YCols)을 선택하라는 메시지가 사용자에게 표시되며 플랫폼에서 열을 처리할 때 Eval(YCols)로 사용할 수 있는 경우가 많습니다. 예를 들면 다음과 같습니다.
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 ) ) )
);
Y( ) 열에서 적합 모델을 올바르게 실행합니다. 그러나 Simulate( ) 명령은 범위가 지정된 열로 참조되는 열을 원합니다. 예를 들어 :My Column To Model과 같습니다.
열 이름이 "My Column To Model"이므로 YCols 및 Eval(YCols) 변수는 모두 다음 {"My Column To Model"}을 반환한다고 가정해 보겠습니다. 시뮬레이션 명령을 보고서로 보낼 때 다음과 같이 범위가 지정된 열 이름이 필요합니다.
report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out( :My Column To Model ),
In( :Simulated Y )
);
문제는 내가 모델링하는 열이 변경될 수 있으므로 이름이 변경된다는 점입니다. 열 이름을 항상 :YData와 같은 고정된 이름으로 바꾸고 싶지는 않습니다. YCols와 같은 변수로 작업하고 싶지만 Simulate( ) 명령에 대한 올바른 열 참조를 갖기 위해 중위 콜론 연산자(:) 및 YCols와 같은 변수로 작업하는 방법을 모르겠습니다.
As Column(dt, name), Column(dt, name), Column(number), Parse(":"||char(Column(avdt, Eval(YCols)))), Parse(":" ||Eval(YCols)[1]), 그 중 어느 것도 작동하지 않습니다. 모두 위에서 언급한 것과 동일한 오류가 발생하고 In/Out을 교환할 열을 선택하기 위한 새 창을 엽니다. 이는 제가 수행하려는 자동화를 무효화합니다.
어떤 도움이라도 대단히 감사하겠습니다.
감사해요!,
DS
고급 통계 모델링자동화 및 스크립팅기본 데이터 분석 및 모델링윈도우Re: JSL이 열을 올바르게 참조하는 데 도움이 됩니다.가능한 해결책을 하나 찾았지만 확실히 효율적이지 않고 다소 번거롭습니다. 더 나은 해결책이 있다고 생각하고 누군가가 나를 도와줄 수 있기를 바랍니다.
JSL에서 명령을 보내는 문자열을 작성하고 Eval(Parse())을 사용하여 실제로 수행하면 작동한다는 것을 알았습니다. 다시 말하지만, 이는 번거롭고 효율적이지는 않지만 작동합니다.
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 ) );이상한 해결책이 있는데 누군가 공유할 수 있는 더 나은 해결책이 있기를 바랍니다.
감사해요!,
DS
Re: JSL이 열을 올바르게 참조하는 데 도움이 됩니다.나에게도 이런 문제가 있다.이것이 최선의 해결책은 아닐 수도 있지만 다음 코드는 원하는 작업을 수행해야 합니다.*편집* 비슷한 방법을 이미 찾으셨군요.=)
Eval(
Parse(
"\[report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out( ]\"
|| YCols[1] || "\[ ),
In( :Simulated Y )
);]\"
)
);
Re: JSL이 열을 올바르게 참조하는 데 도움이 됩니다.열 참조 목록을 작성해야 하는데 Eval이 작동하지 않는 경우 일반적으로 표현식을 작성한 다음 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>Re: JSL이 열을 올바르게 참조하는 데 도움이 됩니다.안녕 @mmarchandTSI 그리고 @jthi ,
이 문제를 해결하는 방법에 대한 피드백과 아이디어를 보내주셔서 감사합니다. JMP/JSL과 관련된 동일한 문제를 해결하는 방법이 여러 가지 있다는 사실에 크게 놀랄 필요는 없습니다. 소프트웨어의 가장 큰 장점 중 하나입니다. 그럼에도 불구하고 "더 간단한" 솔루션이 불가능하다는 점이 흥미롭습니다. 도움을 주셔서 감사합니다!
감사해요,
DS