시뮬레이션을 위해 프로파일 러에서 상관 행렬을 지정하는 방법은 무엇입니까?안녕하세요,
샘플 데이터 집합에서 지정된 수의 행, 평균 / 표준 편차 벡터 및 상관 구조를 사용하여 다변량 정규 데이터를 만드는 스크립트를 작성 중입니다. Profiler 플랫폼의 Simulator를 활용하여 다음 단계를 통해 데이터 테이블을 생성하고 싶습니다.
- 각 변수에 대한 표본 평균과 표준 편차를 계산합니다.
- 샘플 데이터에서 상관 행렬을 생성합니다.
- (1) 및 (2)의 요약 통계를 사용하여 다변량 데이터를 시뮬레이션합니다.
현재 내 스크립트는 각 변수에 대한 적절한 평균과 표준 편차를 사용하여 시뮬레이션 된 데이터 테이블을 생성하지만 변수 간의 상관 관계 구조를 올바르게 유지 관리 할 수 없습니다. 내 문제의 원인은 내가 [ NxN 상관 관계] X 상관 관계 상관 행렬 (예 : [1 0.3 0, 0.3 1 0, 0 0 1])을 명시 적으로 지정하는 대신 변수를 사용했지만 문제 해결 기술로 인해 해결책이 없습니다. 아래에 제공된 현재 스크립트 및 예상되는 출력과 실제 출력, 이러한 단계를 수행하는 방법에 대한 제안을 환영합니다.
JSL :
names default to here(1);
Try( Close( Data Table(dt) ) );
If( Is Empty( dt ),
Try( dt = Open(), Throw( "No data found" ) )
);
ncol = NCol(dt);
//Dialog Window.
Dlg = New Window("New Window",
<< Modal,
BorderBox(left(3), top(2),
V List Box(
TextBox("Simulate multivariate data"),
HListBox(
VListBox(
PanelBox("Select variables",
colListData = ColListBox(all,nLines,(min(ncol,10)))
),
),
PanelBox("Cast Selected Variables",
LineupBox(NCol(2), Spacing(3),
ButtonBox("Variables", colListY << Append(colListData << Get Selected)),
colListY = ColListBox(nLines(6), "numeric"))
),
//specifications - not in use.
PanelBox("Enter Specifications",
Spacer Box(Size(10, 1)),
HListBox(
VListBox(
Spacer Box(Size(5, 10)),
lsl1 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
lsl2 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
lsl3 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
lsl4 = Number Edit Box(, 3)
),
SpacerBox(Size(10,10)),
VListBox(
Spacer Box(Size(5, 10)),
usl1 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
usl2 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
usl3 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
usl4 = Number Edit Box(, 3)
)
),
),
PanelBox("Action",
LineupBox(NCol(1),
// OK button
Button Box("OK",
lsl_mat = J(4,1, .);
lsl_mat[1] = Eval(lsl1 << Get);
lsl_mat[2] = Eval(lsl2 << Get);
lsl_mat[3] = Eval(lsl3 << Get);
lsl_mat[4] = Eval(lsl4 << Get);
usl_mat = J(4,1, .);
usl_mat[1] = Eval(usl1 << Get);
usl_mat[2] = Eval(usl2 << Get);
usl_mat[3] = Eval(usl3 << Get);
usl_mat[4] = Eval(usl4 << Get);
// Store summary statistics
tpListY = colListY << Get Items;
tpMean = J(4, 1, 0);
tpSD = J(4, 1, 0);
for (i=1, i <= nitems(tpListY), i++,
one_col = tpListY[i];
Meani = Col Mean(Column(dt, one_col));
SDi = Col Std Dev(Column(dt, one_col));
tpMean[i] = Meani;
tpSD[i] = SDi;
);
Dlg << CloseWindow
),
// Cancel button
Button Box("Cancel", Dlg << CloseWindow),
Spacer Box(Size(10,10)),
// Remove button
Button Box("Remove", collistY << RemoveSelected)
)
),
)
)
)
);
//correlation matrix
corr = multivariate(
Y(Eval List(tpListY)),
estimation method("Row-wise"),
matrix format("Square"),
scatterplot matrix(0)
);
corr.run = corr << run;
corr.rep = corr.run << report;
corr.mat = corr.rep["Correlations"][matrix box(1)] << get(1);
//only used to launch profiler
prof.x = J(2,4 ,1);
prof.tbl = as table(prof.x, << column names(tpListY), << invisible);
prof.tbl << new column("Y",
Formula( :TP1 + :TP2 + :TP3 + :TP4)
);
prof.tbl = current data table();
random reset(1234);
//specify multivariate data from summary statistics
sim.design = Profiler(
Y(:Y),
Invisible
);
sim.design << Simulator(
1,
Factors(
TP1 << multivariate( tpMean[1], tpSD[1]),
TP2 << multivariate( tpMean[2], tpSD[2]),
TP3 << multivariate( tpMean[3], tpSD[3]),
TP4 << multivariate( tpMean[4], tpSD[4]),
),
X Correlations(
1,
tpListY,
corr.mat
),
N Runs(10000)
);
//Make data table
report( sim.design )["Simulate to Table"][button box( 1 )] << click( 1 );
sim.dt = data table( 1 );
sim.dt << set name( "Simulated multivariate data" );
sim.dt << delete columns({"Y","Obj"});예상 대 실제 출력 :
예상 대 실제
데이터 테이블스크립팅Re : 시뮬레이션을 위해 프로파일 러에서 상관 행렬을 지정하는 방법은 무엇입니까?안녕 뿡뿡 ,
흥미로운 질문입니다. 가능한 경우 도움을 드리고 싶지만 문제를 재현 할 수 없습니다. 스크립트를 실행하려고하면 샘플 데이터 디렉토리에서 데이터 테이블을 열라는 메시지가 표시됩니다. 여기에서 한 가지 문제는 작업중인 데이터 테이블을 모르고 동일한 문제가 발생하지 않는다는 것입니다. 작업중인 데이터 테이블을 제공 할 수 있습니까?
샘플 데이터 (예 : 2D Gaussian process example.jmp 파일)에서 데이터 테이블을 선택하면 다음 대화 상자에서 열을 역할로 캐스팅하라는 메시지가 표시되지만 확인을 클릭하면 해결되지 않은 항목이 있다는 오류가 표시됩니다. name 'Button', Button (-1) / * ### * /를 초과하거나 평가 한 이름입니다. 그런 다음 sim.design << Simulator () send 명령을 좋아하지 않는 코드의 124 행에서 또 다른 오류가 발생합니다.
분명히 이것이 작동하는 데이터 테이블이 있습니다. 공유 할 수 있습니까? 또는 게시물에 표시 한 출력을 생성하는 데 사용중인 테이블에 대해 자세히 설명 하시겠습니까?
감사!,
DS
Re : 시뮬레이션을 위해 프로파일 러에서 상관 행렬을 지정하는 방법은 무엇입니까?안녕 안녕하세요. ,
게시하기 전에 실사를하지 않았습니다. 여기 샘플 데이터 (4 X, TP1-TP4)의 10 개 행 샘플이 있습니다. 현재 스크립트는 4 개의 변수로 제한되어 있지만이를 확장 할 수 있기를 바랍니다. 엔 미래의 변수. 이 샘플 데이터 테이블은 내 문제를 재현합니다. 해결되지 않은 이름 오류는 대화 상자 (취소 / 제거 버튼)에서 비롯된 것이라고 생각하지만 근본 원인을 찾지 못했습니다.
감사,
EA
Re : 시뮬레이션을 위해 프로파일 러에서 상관 행렬을 지정하는 방법은 무엇입니까?안녕 뿡뿡 ,
데이터 테이블 주셔서 감사합니다. 말씀하신대로 문제를 재현 할 수 있습니다. 내가 주목하는 한 가지는 시뮬레이터를 실행할 때 X Correlations의 도움말 색인에있는 Tiretread 예제와 달리 프로파일 러 옆에 히스토그램을 생성하지 않는다는 것입니다.
두 가지 일이 진행되고 있다고 생각합니다.
1. tpListY 호출
2. corr.mat 호출
이유는 모르겠지만 코드에서 X 상관 관계 목록을 명시 적으로 "철자"해야한다고 생각하며 여기에는 상관 행렬이 포함됩니다. 따라서 tpListY를 호출하는 대신이를 {TP1, TP2로 대체해야합니다. , TP3, TP4}. 마찬가지로 대괄호 [] 사이에 실제 4x4 (또는 NxN) 상관 행렬을 넣어야합니다.
Parse (tpListY [1])과 같은 작업을 수행하면 효과가있을 것이라고 생각했지만 Eval ()을 감싸고 있어도 작동하지 않습니다. JSL 코드를 {TP1, TP2, TP3, TP4}로 입력해야만 자동으로 작동하도록 할 수 있습니다. NxN 상관 행렬을 입력 할 때 실제로는 행렬의 왼쪽 아래 삼각형을 사용하여 테이블을 채 웁니다.
또한 corr.mat [1] 등에서와 같이 corr.mat의 요소를 호출하는 것이 작동 할 수 있다고 생각했지만 역시 작동하지 않습니다. 시도하면 잘못된 행렬 토큰 오류가 발생하고 corr.mat의 요소가 숫자이기 때문에 그 이유가 확실하지 않습니다.
아래 코드 (기능을 약간 변경하여 수정)는 예상되는 출력을 제공하지만 4x4 시스템에서 NxN 시스템으로 확장하려는 욕구에는 도움이되지 않습니다.
names default to here(1);
Try( Close( Data Table(dt) ) );
If( Is Empty( dt ),
Try( dt = Open(), Throw( "No data found" ) )
);
ncol = NCol(dt);
//Dialog Window.
Dlg = New Window("New Window",
<< Modal,
BorderBox(left(3), top(2),
V List Box(
TextBox("Simulate multivariate data"),
HListBox(
VListBox(
PanelBox("Select variables",
colListData = ColListBox(all,nLines,(min(ncol,10)))
),
),
PanelBox("Cast Selected Variables",
LineupBox(NCol(2), Spacing(3),
ButtonBox("Variables", colListY << Append(colListData << Get Selected)),
colListY = ColListBox(nLines(6), "numeric"))
),
//specifications - not in use.
PanelBox("Enter Specifications",
Spacer Box(Size(10, 1)),
HListBox(
VListBox(
Spacer Box(Size(5, 10)),
lsl1 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
lsl2 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
lsl3 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
lsl4 = Number Edit Box(, 3)
),
SpacerBox(Size(10,10)),
VListBox(
Spacer Box(Size(5, 10)),
usl1 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
usl2 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
usl3 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
usl4 = Number Edit Box(, 3)
)
),
),
PanelBox("Action",
LineupBox(NCol(1),
// OK button
Button Box("OK",
lsl_mat = J(4,1, .);
lsl_mat[1] = Eval(lsl1 << Get);
lsl_mat[2] = Eval(lsl2 << Get);
lsl_mat[3] = Eval(lsl3 << Get);
lsl_mat[4] = Eval(lsl4 << Get);
usl_mat = J(4,1, .);
usl_mat[1] = Eval(usl1 << Get);
usl_mat[2] = Eval(usl2 << Get);
usl_mat[3] = Eval(usl3 << Get);
usl_mat[4] = Eval(usl4 << Get);
// Store summary statistics
tpListY = colListY << Get Items;
tpMean = J(4, 1, 0);
tpSD = J(4, 1, 0);
for (i=1, i <= nitems(tpListY), i++,
one_col = tpListY[i];
Meani = Col Mean(Column(dt, one_col));
SDi = Col Std Dev(Column(dt, one_col));
tpMean[i] = Meani;
tpSD[i] = SDi;
);
Dlg << CloseWindow
),
// Cancel button
Button Box("Cancel", Dlg << CloseWindow),
Spacer Box(Size(10,10)),
// Remove button
Button Box("Remove", collistY << RemoveSelected)
)
),
)
)
)
);
//correlation matrix
corr = multivariate(
Y(Eval List(tpListY)),
estimation method("Row-wise"),
matrix format("Square"),
scatterplot matrix(0)
);
corr.run = corr << run;
corr.rep = corr.run << report;
corr.mat = corr.rep["Correlations"][matrix box(1)] << get(1);
//only used to launch profiler
prof.x = J(200,4 ,1);
prof.tbl = as table(prof.x, << column names(tpListY), << invisible);
prof.tbl << new column("Y",
Formula( :TP1+:TP2^2-:TP3+:TP4*Random Normal(0,2))
);
prof.tbl = current data table();
random reset(1234);
//specify multivariate data from summary statistics
sim.design = Profiler( Y( :Y ), Invisible );
sim.design << Simulator(
1,
Factors(
TP1 << multivariate( tpMean[1], tpSD[1] ), TP2 << multivariate( tpMean[2], tpSD[2] ),
TP3 << multivariate( tpMean[3], tpSD[3] ), TP4 << multivariate( tpMean[4], tpSD[4] ),
),
Responses( Y << No Noise ),
Automatic Histogram Update( 1 ),
X Correlations( 1, {TP1, TP2, TP3, TP4},
[1 0.6401843997 0.670478399654806 0.6405126152, 0.6401843997 1 0.9443055859 0.8815992957, 0.6704783997 0.9443055859 1 0.9355872238, 0.6405126152 0.8815992957 0.9355872238 1]
),
N Runs( 10000 ),
Simulate
);
//Make data table
report( sim.design )["Simulate to Table"][button box( 1 )] << click( 1 );
sim.dt = data table( 1 );
sim.dt << set name( "Simulated multivariate data" );
sim.dt << delete columns({"Y","Obj"});인자에 대한 다변량 노이즈를 채우기 위해 tpMean 및 tpSD의 요소를 호출 할 수 있기 때문에이를 수행하는 방법이 있어야합니다. JSL에 대한 더 많은 경험을 가진 사람이 그것에 대해 언급 할 필요가 있다고 생각합니다.
마지막으로, 버튼 상자 중 하나에 대해 옳다고 생각하지만 정확하게 지적 할 수 없었습니다. tpListY 및 corr.mat 문제를 해결하는 데 더 집중했습니다!;)
나는 당신이 알아 낸 것에 정말로 관심이 있습니다.
행운을 빕니다,
DS
Re : 시뮬레이션을 위해 프로파일 러에서 상관 행렬을 지정하는 방법은 무엇입니까?안녕 안녕하세요. ,
문제 해결에 도움을 주셔서 감사합니다. 나는 비슷한 기능을 가지고 놀았다. 평가, 평가 Expr (Expr (x) ) , 과 Evalinsert Profiler로 보내기 전에 열과 행렬 변수를 평가하도록 강제하여 해결책을 찾았습니다. X 상관 관계 수락하는 것 같습니다). 위의 동일한 솔루션을 적용하여 Profiler를 다른 열 이름에 유연하게 적용했습니다. 이제 내 상관 관계 구조가 시뮬레이션 된 데이터에서 유지됩니다.
new.design = evalinsert(
"\[sim.design << Simulator(
1,
Factors(
Name( "^col1^" ) << multivariate( tpMean[1], tpSD[1]),
Name( "^col2^" ) << multivariate( tpMean[2], tpSD[2]),
Name( "^col3^" ) << multivariate( tpMean[3], tpSD[3]),
Name( "^col4^" ) << multivariate( tpMean[4], tpSD[4]),
),
X Correlations(
1,
^tpListY^,
^corr.mat^
),
N Runs(10000)) ]\");
eval(parse(new.design));
다시 한 번 감사드립니다.
EA
Re : 시뮬레이션을 위해 프로파일 러에서 상관 행렬을 지정하는 방법은 무엇입니까?안녕 뿡뿡 ,
훌륭한 솔루션이며, 그렇게했던 것을 기억했으면합니다. 일부 모델 튜닝을 자동화하기 위해 스크립트를 작성할 때 비슷한 작업을 수행해야했습니다. EvalInsert () 및 인용 부호의 이스케이프 문자와 값 삽입을위한 ^^가 매우 유용했습니다. 나는 그것을 자주 사용하지 않고 특정 일을하는 방법을 잊어 버렸습니다.
호기심 때문에 지정된 상관 관계 구조를 사용하여 이와 같은 시뮬레이션 데이터를 생성해야하는 이유는 무엇입니까? 제가 작업중인 작업에이를 통합하는 방법에 대한 몇 가지 아이디어를 얻었 기 때문에 저는 상당히 관심이 있습니다.
감사!,
DS
Re : 시뮬레이션을 위해 프로파일 러에서 상관 행렬을 지정하는 방법은 무엇입니까?안녕 안녕하세요. ,
일반적으로 몇 가지 과거 매개 변수를 기반으로 모델링 목적 (모델 튜닝)을 위해 다 변수 데이터 세트를 자주 시뮬레이션합니다. 이 스크립트는이 모의 데이터를 제공하는 간단한 솔루션 일뿐입니다. 지금은 특정 사용 사례가 없지만이 스크립트를 n 차원으로 확장하고 잠재적으로 기능으로 사용할 계획입니다. 기준 치수 큰 샘플 기술을 사용하는보다 광범위한 스크립트에 통합 할 수 있습니다. 평균 / 표준 벡터 및 상관 행렬을 프로파일 러 플랫폼으로 보내는 제약 조건이 주어지면 시뮬레이션을 n 차원으로 확장하기 위해 선형 연산을 명시 적으로 작성하는 데 의지 할 것입니다.
문안 인사,
Eangello
Re : 시뮬레이션을 위해 프로파일 러에서 상관 행렬을 지정하는 방법은 무엇입니까?안녕하세요 뿡뿡 ,
상관 관계 구조로 무엇을하고 싶은지 깨달았을 때 바로 그것이 제 마음 속에 떠오른 것입니다. 나는 당신의 아이디어를 빌려서 내가 직면 한 특정 문제 중 일부로 수정하고 싶습니다. N 입력으로 일반화하는 것에 대한 다른 스레드에 게시했습니다. 나는 내가 꽤 가깝다고 생각하지만 거기에는 그렇지 않습니다. X Correlations ()를 호출하고 요인에 대한 평균 및 표준 dev 값을 설정할 때 확장하는 데 어려움이 있습니다.
첨부는 원본 스크립트를 기반으로하는 실물 모형 데이터 테이블과 스크립트입니다. 내가 저지르는 실수를 찾을 수 있을까요? 저는 이것이 임의의 수의 열에서 작동하는 것을보고 싶습니다. 지적한 바와 같이 과거 데이터에 매우 유용 할 것입니다.
감사!,
DS
Re : 시뮬레이션을 위해 프로파일 러에서 상관 행렬을 지정하는 방법은 무엇입니까?안녕하세요 뿡뿡 ,
N 열로 확장 가능한 스크립트를 만들 수 있었다고 생각합니다. 나는 주다 @ms 프로파일 러의 상관 관계 부분을 일반화하는 데 도움이되는 막대한 크레딧. 그 스레드는 여기 .
구현 한 것과 같은 독립형 버전이지만 원본 게시물에있는 추가 변수가없는 스크립트와 데이터 테이블 자체에서 실행할 수있는 스크립트가 있습니다. 독립형은 아래에 있으며 데이터 테이블에서 실행되는 것은 Gendt.jmp 데이터 테이블에 있습니다. 4 개의 열이있는 데이터 테이블과 11 개의 열로 만든 다른 데이터 테이블 모두에서 작동합니다. 다른 열 유형이있는 데이터 테이블에 대한 독립 실행 형 스크립트도 일반화하려고했습니다.
Names Default To Here( 1 );
// Expression to clear all current settings
clearRoles = Expr( ColListY << RemoveAll );
// Expression to store the current settings in global variables
recallRoles = Expr(
::ycolRecall = ColListY << GetItems
);
//get data table
Try( Close( Data Table( dt ) ) );
If( Is Empty( dt ),
Try( dt = Open(), Throw( "No data found" ) )
);
//Find the number of columns in the data table
ncol = N Col( dt );
ColList = dt << Get Column Names( Numeric, Continuous );
//Dialog Window.
Dlg = New Window( "New Window",
<<RETURN result=""></RETURN>
또한, 나는 당신이받는 Button Box 오류가 대화 창에 대한 << Modal 호출과 관련이 있다고 생각합니다. 나는 그것을 << Return Result로 바꾸었고 더 이상 오류가 발생하지 않습니다. Recall 버튼도 포함했지만 꼭 가질 필요는 없습니다.
도움이 되었기를 바랍니다. 정말 멋졌고 그로부터 많은 것을 배웠습니다. 나는 내가하는 일에 이것을 확실히 사용할 수 있다는 것을 안다!
감사!,
DS
Re : 시뮬레이션을 위해 프로파일 러에서 상관 행렬을 지정하는 방법은 무엇입니까?안녕하세요 안녕하세요. ,
나는 그 접근 방식을 결코 생각하지 못했을 것입니다. 대화 창은 당신이 맞다고 생각합니다. Profiler 플랫폼을 모두 함께 피하는 것은 두통이 덜한 것으로 판명되었지만 그것은 나를 위해 풀리지 않는 좋은 아이디어였습니다. 다음은 동일한 결과이지만 (R에서 구현하기 위해 수행하는 단계와 유사) 소란이 적고 입력으로 필요한 평균 벡터 및 공분산 행렬 만 있습니다.
//tpListY is variables.<BR /><BR />cov = multivariate(
Y(eval list(tpListY)),
estimation method("Row-wise"),
matrix format("Lower Triangular"),
scatterplot matrix(1)
);
cov << covariance matrix(1);
cov.run = cov << run;
cov.rep = cov.run << report;
cov.mat = cov.rep["Covariance Matrix"][matrix box(1)] << get(1);
random reset(1234);
//generate X = (X1, . . . , Xn) where X ∼ MNn(µ, Σ) using the Cholesky decomposition of Σ
//to find (nxn) matrix, C, such that C*C` = Σ.
//let Z = (Z1, . . . , Zn)` where the Zi’s are IID N(µ, 1) for i = 1, . . . , n.
//mean.M is mean vector.
sim.n = 1e4;
dummy.mat = j(1,sim.n,1);
mean.mat = mean.M*dummy.mat;
n.means = n row(mean.M);
sim.C = cholesky(cov.mat);
sim.Z = j(n.means, sim.n, random normal());
sim.X = sim.C*sim.Z;
sim.X2 = sim.X + mean.mat;
sim.Xt = transpose(sim.X2);
as table(sim.Xt, << column names(tpListY));
동일한 작업을 수행하기 위해 적은 코드를 사용하는 것을 선호하므로 프로파일 러 경로보다 더 매력적이었습니다. 바라건대 이것은 다른 곳에서 구현하기 쉽게 만듭니다.
다시 한 번 감사드립니다.
Eangello