연관 배열에서 계산 평가 수행안녕하세요,
연관 배열 내부에 저장된 표준 편차 계산을 반환하는 함수를 가져오려고 합니다. 내 코드는 계산이 아닌 연관 배열의 식만 반환합니다.내 코드에 어떤 문제가 있는지 알려주시겠습니까?
cvf = 최대 ( 답장하다 ) ;// 파일의 내 cvf는 8입니다.
이력서 = 연관 배열 () ;
이력서 [ 6 ] = 연관 배열 ({( 표준 편차 ( 5 , 6 , 7 , 8 , 9 , 10 ))}) ;
이력서 [ 8 ] = 연관 배열 ({( 표준 편차 ( 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 ))}) ;
이력서 [ 12 ] = 연관 배열 ({( 표준 편차 ( 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ))}) ;
CVC = 기능 ( { 심판 } , 현지의 ({ 이력서 = 연관 배열 ({ cvf , 평가 ( cvf )} )} , 이력서 << 값을 얻다 ( cvf )) ; 이력서 [ 심판 ]) ; ) ;
ㅏ = CVC ( cvf ) ;
평가 ( 평가판 ( ㅏ )) ;
쇼(a);
이것은 내가 얻는 결과입니다.
a = 연관 배열({{Std Dev( 5, 6, 7, 8, 9, 10, 11, 12 ), 1}}, 0);
이것은 내가 원하는 결과입니다: a= 2.5
Re: 연관 배열에서 계산 평가를 수행합니다.Summarize(age grp)는 두 목록의 목록이며 연관 배열(age grp)과 호환되지 않습니다. 또한 avg 및 sd는 Summary(age grp)와의 상호 참조와 호환되지 않는 단일 목록에 있습니다. 아래 코드는 목록을 올바르게 정렬합니다(예쁘지 않음).
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Summarize( sum = By( :age),sex grp= By (:sex), avg = Mean( :height ), sd = Std Dev( :height ) );
age grp = Associative Array( :age ) << Get Keys;
sex grp = Associative Array( :sex ) << Get Keys;
dt << New Column( "CV" ) << New Column( "AVG" ) << New Column( "SD" );
For( g = 1, g <= nitems(age grp), g++,
For(i =1, i<=nitems(sex grp), i++,
rows = dt << get rows where( :age == age grp[g] & :sex == sex grp[i] );
if( i==1,
:AVG[rows] = avg[ g*2-1 ];
:SD[rows] = sd[ g*2-1 ];
:CV[rows] = 100 * avg[ g*2-1 ] / sd[ g*2-1 ];
,
:AVG[rows] = avg[ g*i ];
:SD[rows] = sd[ g*i ];
:CV[rows] = 100 * avg[ g*i ] / sd[ g*i ];
)));
Re: 연관 배열에서 계산 평가를 수행합니다.감사합니다. 작동합니다
Re: 연관 배열에서 계산 평가를 수행합니다.언제 나타났는지는 확실하지 않지만 참고로 제 JMP(13) 버전에서 "CV"가 '표 > 요약'에서 제공하는 통계 중 하나라는 것을 방금 알았습니다. 따라서 수식 열이 필요하지 않습니다.
Re: 연관 배열에서 계산 평가를 수행합니다.두 개의 그룹화 변수가 있다는 사실을 놓친 것에 대해 사과드립니다. 이 수정된 스크립트는 작동 방식을 보여줍니다.
Names Default to Here( 1 );
// Open example of a data table
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Estimate group statistics and group identities
Summarize( age sex grp = By( :age, :sex ), avg = Mean( :height ), sd = Std Dev( :height ) );
// Make a new columns for group result
dt << New Column( "Avg" ) << New Column( "SD" ) << New Column( "CV" );
// Iterate over groups
For( g = 1, g <= N Items( age grp ), g++,
// Convert :age level to match data type of identity
rows = dt << Get Rows Where( Char( :age ) == age sex grp[1][g] & :sex == age sex grp[2][g] );
:Avg[rows] = avg[g];
:SD[rows] =sd[g];
:CV[rows] = 100 * sd[g] / avg[g];
);
연관 배열이 그룹을 식별하는 가장 효율적인 방법이라고 생각하지 않습니다. Summarize() 함수는 동시에 그룹 통계를 추정하고 그룹 수준의 두 병렬 목록을 사용하여 연결된 그룹을 식별합니다. 내 생각에 유일한 단점은 원래 수준이 이 경우 :age 수준과 같이 숫자인 경우에도 그룹화 수준이 항상 문자열이라는 것입니다. 그래서 대상 행 번호를 가져오는 데 사용되는 비교를 위해 :age 수준을 변환해야 했습니다.
이제 요약 명령\을 사용하는 Ian의 솔루션을 포함하여 두 가지 접근 방식이 있습니다.
Re: 연관 배열에서 계산 평가를 수행합니다.이것이 더 효율적인지 확인할 수 있습니다(예상할 수 있음).
Names Default To Here( 1 );
// Example table
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Edit to taste . . .
var = Column(dt, "height");
byVars = {Column(dt, "sex"), Column(dt, "age")};
// Use a summary table with formula column
dt2 = dt << Summary(Group(byVars), Mean(var), Std Dev(var));
Column(dt2, 4) << setName("Mean");
Column(dt2, 5) << setName("StdDev");
dt2 << New Column( "CV", Numeric, "Continuous", Format( "Percent", 12, 3 ), Formula(:StdDev/:Mean));
원본 테이블의 CV 값이 필요한 경우 '테이블 > 조인'을 사용하십시오.
Re: 연관 배열에서 계산 평가를 수행합니다.안녕 마크,
나는 귀하의 예를 사용하고 행 번호를 올바르게 얻을 수 있지만 평균 및 표준 편차가 올바르지 않습니다. 그리고 내 테이블은 10,000줄이 넘고 계산이 약간 느립니다. 내가 어디에서 잘못했는지 말해 주시겠습니까? 감사해요.
여기에 기본 이름 ( 1 ) ;
dt = 열려 있는 ( "$SAMPLE_DATA/빅 클래스.jmp" ) ;
요약하다 ( 연령 그룹 = 에 의해 ( : 나이 ) , 섹스 그룹 = 에 의해 ( : 섹스 ) , 평균 = 평균 ( : 키 ) , SD = 표준 편차 ( : 키 ) ) ;
연령 그룹 = 연관 배열 ( : 나이 ) << 키 가져오기 ;
섹스 그룹 = 연관 배열 ( : 섹스 ) << 키 가져오기 ;
dt << 새 열 ( "이력서" ) ;
을 위한 ( g = 1 , g <= 나이트 ( 연령 그룹 ) , g ++,
~을 위한 ( 나 = 1 , 나 <= 나이트 ( 섹스 그룹 ) , 나 ++,
행 = dt << 행 가져오기 ( : 나이 == 연령 그룹 [ g ] & : 섹스 == 섹스 그룹 [ 나 ]) ;
: 이력서 [ 행 ] = 100 * SD [ 나 ] / 평균 [ 나 ] ;
)) ;
Re: 연관 배열에서 계산 평가를 수행합니다.감사합니다. 제가 찾고 있는 것이 원합니다. 감사합니다.
슈
Re: 연관 배열에서 계산 평가를 수행합니다.다음 예를 시도해 보십시오.
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Summarize( age grp = By( :age ), avg = Mean( :height ), sd = Std Dev( :height ) );
age grp = Associative Array( :age ) << Get Keys;
dt << New Column( "CV" );
For( g = 1, g <= N Items( age grp ), g++,
rows = dt << Get Rows Where( :age == age grp[g] )
:CV[rows] = 100 * sd[g] / avg[g];
);
Re: 연관 배열에서 계산 평가를 수행합니다.데이터 테이블에는 세 개의 열이 있으며 하나는 복제 번호를 나타내고 다른 하나는 복제에 대한 신호 출력을 가지며 마지막 열에는 데이터 ID가 있습니다. 모든 dataID에 대한 표준 편차를 계산해야 합니다. 모든 데이터는 "Titer"라는 특정 유형을 제외하고 두 번만 복제되며 데이터가 생성되는 위치에 따라 데이터 유형 "Titer"는 6, 8 또는 12개의 복제를 가질 수 있습니다. 따라서 이 세 가지 경우를 배열로 만들고 복제 열에 연결합니다.
내 코드를 사용하고 공식을 표준 편차 계산으로 반환하지만 CV 계산을 위해 새 열에 입력하면 아무 작업도 수행되지 않습니다.
내가 생각할 수 있는 다른 옵션은 Tabulate 플랫폼을 사용하여 표준 편차를 가져와 배열에 넣고 새 열에 다시 할당하는 것입니다. 어떠한 제안?
Re: 연관 배열에서 계산 평가를 수행합니다.다시 시작합시다.
- 무엇을 하려고 합니까?
- 당신의 데이터는 어떤가요?
- 어떻게 구성되어 있습니까?
- 필요한 결과는 무엇입니까?
- 결과로 무엇을 하시겠습니까?
연관 배열을 사용해야 하는지 명확하지 않습니다.
Re: 연관 배열에서 계산 평가를 수행합니다.내 문제를 파악했지만 새로운 문제가 생겼습니다.
내 연관 배열은 수식이며 계산을 수행하려면 키를 검색해야 합니다.
내 코드는 표준 편차를 계산하는 방법에 대한 공식인 a를 반환합니다. 하지만 수식을 새 수식에 입력하면 새 수식이 계산을 수행하지 않습니다.
ㅏ = CVC ( cvf ) << 열쇠를 얻다 ( cvf ) ;
보여주다 ( ㅏ ) ;// 이것은 다음과 같은 공식입니다.
{Std Dev(:INSTRUMENT_SIGNAL[Row() + 8], :INSTRUMENT_SIGNAL[Row() + 1], :INSTRUMENT_SIGNAL[Row() + 2], :INSTRUMENT_SIGNAL[Row() + 3], :INSTRUMENT_SIGNAL[Row() + 4], :INSTRUMENT_SIGNAL[행() + 5], :INSTRUMENT_SIGNAL[행() + 6], :INSTRUMENT_SIGNAL[행() + 7])};
그러나 아래의 새 공식에 a를 입력하면 a가 계산을 수행합니다. 도와주세요!
씨 올 2 << 공식 설정 ( 만약에 ( : 런샘플카인드 == "TITERC.NEG" , ( ㅏ / : 평균 신호 ) * 100 ) ,
만약에 ( : 런샘플카인드 [ 열 ()] == : 런샘플카인드 [ 열 () + 1 ] ,
만약에 ( : 대표 [ 열 ()] != 2 , ( 표준 편차 ( : 악기_신호 [ 열 () + 1 ] , : 악기_신호 [ 열 ()] ) / : 평균 신호 ) * 100 ) ) ) ;