빅데이터 / Zero Variance로 인한 자동 컬럼 제거안녕하세요
저는 열에 최소 약 2000개의 매개변수가 포함된 매우 큰 데이터 세트를 분석하고 있습니다. 내 샘플에는 ~ 250,000개 행에 대한 이러한 매개변수 값이 있습니다. 내 문제는 행이 아닌 열에 있습니다.
모든 샘플에 대해 두 개의 이산 값, 즉 클래스 A와 B에 대해 이산 분류가 정의되어 있습니다.
다른 소프트웨어에서 데이터를 추가로 분석하고 있는데 분산이 0(또는 매우 가까운) 매개변수를 감지하면 실패합니다.
나는 이 작업을 수동으로 수행하고 싶지 않습니다(2000개의 열에서 상상할 수 있듯이)..
클래스 A 또는 B에 대해 차이가 0(또는 정의된 매우 작은 임계값 미만)인 열을 삭제하는 가능한 한 자동화된 방법을 찾고 있습니다. 작업을 완료하기 위해 여러 단계를 거치지만 삭제를 위해 열을 수동으로 선택하고 싶지는 않습니다.
도움을 주시면 감사하겠습니다. 미리 감사드립니다.
Re: 빅데이터 / Zero Variance로 인한 자동 열 제거브래디,
아래 스크립트는 귀하의 것에서 약간 수정되었으며 시작점이 되어야 합니다. (표준 개발에 대한 약간의 수정이 임계값과 비교됨) 아시다시피, 이 삭제 작업은 스크립트에 의해 자동으로 수행되므로 추가 진행을 위해서는 실제 스크립트가 필요합니다. JMP 데이터 선택 이후의 다음 단계 내부 코드는 특히 차이가 0인 경우 문제가 발생합니다. 귀하의 이전 버전(예: 아래)에서는 이러한 항목을 제거할 수 있음이 입증되었습니다.나는 평균 차이는 있지만 분산은 0인 매개변수를 삭제하지 않으려고 노력하고 있습니다.
실제 모수 평균 및 분포에 따라 달라지는 임계값을 사용할 수 없습니다. 예를 들어 실제적인 차이점을 구체적으로 명시할 수는 없습니다. 이를 위해서는 2000개 매개변수 모두에 대한 심층 조사가 필요하지만 실현 가능하지 않기 때문입니다. 내가 언급했는지는 확실하지 않지만 2000년은 빙산의 일각일 뿐이며 더 많은 일이 일어날 것입니다. 그러나 단일 데이터세트에는 대략 2000개의 매개변수가 포함됩니다.
p_value를 사용하여 내부 코드에서 오류를 일으키는 매개변수에 따라 매개변수를 필터링하거나 필터링할 수 있습니다. 그런 관점에서는 t-test가 더 나은 선택일 수 있다고 생각합니다. 그런데 t-test를 어떻게 삽입하고 p_value를 추출하는지 모르겠어서.... 추가 필터로 추가하면 되겠네요.
두 가지 선택이 있는 것 같아요...
1) 더 이상 2-샘플 비교를 의미하지 않고 아래 코드를 있는 그대로 사용하겠습니다. 수단이 다르더라도 해당 사례는 모두 삭제됩니다. 그런 다음 삭제된 항목의 열 이름을 기록해야 합니다(도움이 필요함). 그러면 전체 연구가 끝날 때 해당 항목에 주의를 돌리고 jmp에서 분석하여 평균 차이가 있는지 감지할 수 있습니다. 이것은 백분율 기준으로 훨씬 더 작은 매개변수 분석 세트가 될 것입니다. 제로 분산 사례는 데이터 세트의 매우 최소한의 부분이 될 것으로 예상됩니다.
2) 또는 두 번째 옵션은 t-검정이나 유의미한 차이의 모집단을 미세 조정하기 위한 정규화된 임계값을 제공하는 기타 테스트를 추가하는 것입니다. 예. p_value를 사용하여 유의성을 확인하거나 거부할 수 있습니다.
어떻게 생각하나요 ?
감사해요
------------------------------------- ------------------------------------- -------------
이름의 기본값은 여기에 있습니다( 1 );
dt = 현재 데이터테이블();
dtcol1 = 열(dt, 1);
dt1 = dt << subset(rows(dt<< 행 가져오기 Where(ascolumn(dtcol1) == dtcol1[1])), visible, selected columns(0));
dt2 = dt << subset(rows(dt<< 행 가져오기 Where(ascolumn(dtcol1) != dtcol1[1])), visible, selected columns(0));
// 모든 연속 데이터 열을 가져옵니다.
colList = dt << 열 이름 가져오기(숫자, 연속형);
// 모든 열을 반복하여 차이가 없는 열을 찾습니다.
For( i = N 항목( collist ), i >= 1, i--,
If( (Col Std Dev( Column( dt1, colList[i] ) ) ) >= 0.01 & Col Std Dev( Column( dt2, colList[i] ) ) >= 0.01,
colList = 제거( colList, i, 1 )
)
);
// 변화가 없는 열을 삭제합니다.
dt<<열 삭제(colList);
close(dt1, nosave);
close(dt2, nosave);
참고: 표준 개발의 임계값은 정해져 있지 않습니다. 0.01은 단지 하나의 예일 뿐입니다. 미세 조정하겠습니다.
Re: 빅데이터 / Zero Variance로 인한 자동 열 제거<<열 개수인 ~2,000개가 아닌 ~250,000개의 행이 있다는 점을 반영하여 수정했습니다.>>
Altug, 명확히 하고 싶은 것이 있습니다. 두 그룹에 약 250K 행의 데이터가 있는데 (기본적으로) 대략 동일한 크기라고 가정합니다. 그렇다면 각 그룹에 125,000개 샘플을 사용한 t-검정의 검정력은 .9로 1/50 시그마 미만의 차이를 탐지합니다. 하나 또는 두 시그마 수준이 모두 매우 낮은 경우에만 이 지점(테스트 수단)에 도달했다는 점을 감안할 때 실제로 중요하다고 생각하는 작은(시그마에 비해) 차이가 있습니까? 즉, 대략 시그마 = 1 단위인 2개의 프로세스가 있는 경우 0.018 단위의 평균 차이가 중요합니까? 이는 각 그룹에 125,000개의 항목이 있을 때 t-검정의 민감도를 나타냅니다.
설정에서 이러한 작은 차이가 중요하지 않은 경우 차이가 얼마나 큰지 지정할 수 있는 동등성 테스트(가장 간단한 형태의 2, 동시, 단측 t-테스트)를 사용하는 것이 더 좋습니다. 의미가 있습니다. 이 금액보다 작은 차이가 있는 수단은 실질적으로 동일한 것으로 간주됩니다. 이 접근 방식을 사용하면 평균이 실질적으로 동일하고 그룹 표준 편차 중 하나 이상이 임계값 미만인 한 특정 열이 삭제됩니다.
다음은 몇 가지 정보와 예입니다.
http://www.jmp.com/support/help/Equivalence_Test.shtml
Re: 빅데이터 / Zero Variance로 인한 자동 열 제거고마워요 듀안.
매개 변수가 다른 wrt 클래스 A와 B인지 특정 출력 및 비교를 통해 스크립트 내에서 확인하려고 합니다. 나는 결정을 내리기 위해 중간 결과표를 분석하려는 것이 아닙니다.
특정 데이터세트에 2000개의 매개변수 열이 있고 비슷한 크기의 많은 데이터세트가 있습니다.
프로시저는 지정된 매개변수에 대해 두 클래스 A와 B 사이에서 거의 동일한 것으로 발견된 관련 열을 자동 삭제해야 합니다.
나는 처음에 이것을 제로 분산 추구 논리로 기록했지만 문제는 분산이 0이지만 수단이 다른 두 매개변수를 삭제해서는 안 된다는 것입니다. 그때부터 2표본 평균 검정을 비교하기 위한 검정을 포함하도록 논리를 변경하기 시작했습니다.
제 문제는 제가 스크립팅에 매우 초보자이고 특정 플랫폼의 결과에서 매개변수를 호출하는 방법을 모른다는 것입니다.
우리 데이터의 또 다른 문제는 스크립트에 모든 매개변수를 지정했다는 것입니다. 이와 같은 작업을 수행하는 것은 시간이 많이 걸릴 수도 있습니다(아마도 충분히 쉬운 방법이 있을 수 있습니다).
Brady의 스크립트는 평균에 대한 2-샘플 테스트를 추가하고 해당 출력을 추가 필터로 사용하는 방법을 알아야 한다는 점을 제외하면 실제로 거의 완벽합니다.
당신의 도움을 주셔서 감사합니다.
Re: 빅데이터 / Zero Variance로 인한 자동 열 제거정확한 테스트는 계산하는 데 매우 오랜 시간이 걸릴 수 있으며 데이터 테이블에 250,000개의 행이 있는 경우 이 상황에서는 계산되지 않을 것이라고 확신합니다.대신에 다음을 사용하는 것이 좋습니다.
Summarize YByX()
모든 Fit Y By X 조합을 계산하고 각 y/x 조합에 대한 p-값 및 LogWorth 값의 데이터 테이블을 생성하는 명령입니다.그런 다음 추가로 조사할 올바른 열을 결정할 수 있습니다.별도의 단계에서 분산이 0인지 테스트해야 합니다.
Re: 빅데이터 / Zero Variance로 인한 자동 열 제거브래디
메커니즘을 이해하기 위해 샘플 데이터세트(아직 크지는 않음)에서 이것을 테스트했습니다. st에 임계값을 설정하도록 수정할 수 있었습니다. 개발자 0을 요구하는 것보다 남은 문제는 다음과 같은 경우에는 데이터를 삭제하고 싶지 않다는 것입니다.
stdev<=임계값(즉, 0에 가까움) 및 데이터 평균(클래스 A 및 B에 대한 매개변수 wrt)이 다릅니다.
따라서 추가 제약 조건으로 평균 wrt를 A 및 B와 비교하는 테스트를 추가해야 합니다.
나는 Kolmogorov-Smirnov 테스트를 생각하고 있었습니다. 이 경우 간단히 "KS <= 임계값(실질적으로 0에 가까움)인 경우 매개변수를 삭제합니다"라고 말할 수 있습니다.
사실 제가 하려는 것은 다음 단계에서 다른 매개변수를 선택하지 않는 것입니다. 그래서 저는 아마도 최선의 방법은 KS를 적용하는 것이라고 생각하기 시작했습니다(표준 개발은 필요하지 않습니다).
JMP 도움말은 다음을 제공합니다.
이름의 기본값은 여기에 있습니다( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
obj = Oneway( Y( :Height ), X( :sex ) );
obj << 콜모고로프 스미르노프 정확 검정( 1 );
이것이 (현재 루프 내에서) 내 경우로 번역될 수 있습니까?
obj=Oneway( Y(:Column( dt1, colList[i] ), X( Column( dt2, colList[i] ) ) );
obj << 콜모고로프 스미르노프 정확 검정( 1 );
하지만 이 obj 개체에서 KS 값을 추출하는 방법을 모르겠습니다.
그건 그렇고, 나는 데이터에 대한 수동 터치를 피하기 위해 무엇이든 할 의향이 있기 때문에 2000개 열의 CPU 시간이 나를 귀찮게 할 것이라고 생각하지 않습니다.
정말 고마워요.
Re: 빅데이터 / Zero Variance로 인한 자동 열 제거짐,
여기까지 안내해 주셔서 감사합니다. 나는 그것을 시험해 볼 것이다. 다시 한번 감사드립니다.
Re: 빅데이터 / Zero Variance로 인한 자동 열 제거당신의 이해는 정확합니다 Brady.강조해야 할 점은 250,000개의 행이 있으면 2000 x 250,000의 행렬이 된다는 것입니다.
Re: 빅데이터 / Zero Variance로 인한 자동 열 제거그리고 이 청크와 이전 청크는 선택 반전 대 두 번 선택으로 인해 10분의 1초가 더 걸립니다. 더 큰 테이블에서 더 큰 이득을 얻을 수 있습니다.
dtcol1 = column(dt, 1);
dt << select where(ascolumn(dtcol1) == dtcol1[1]);
dt1 = dt << subset(selected rows(1), invisible, selected columns(0));
dt << Invert Row Selection;
dt2 = dt << subset(selected rows(1), invisible, selected columns(0));
Re: 빅데이터 / Zero Variance로 인한 자동 열 제거Altug, 내 코드를 약간 테스트했는데 명시적인 루핑을 방지하는 것은 좋지만 << get all value as mat() 함수는 테이블이 커지면 너무 비싸고 이득(있는 경우)이 발생합니다. vstd()와 테이블 작업의 비교는 이를 상쇄하기에는 너무 미미합니다.
귀하의 크기에 맞는 테이블의 경우 (그룹을 허용하기 위해) Jim의 코드를 수정하는 것이 더 빠를 것입니다. 이것의 핵심은 JMP 테이블 작업이 정말 빠르다는 사실입니다. 나는 정말 빠른 행렬 연산이 열 함수보다 빠르다는 사실조차 확신하지 못합니다.
처음에 두 개의 하위 테이블(각 그룹당 하나씩)을 생성하기 위해 테이블을 하위 세트로 설정하면 행의 하위 세트를 계속해서 가져오는 데 비용이 많이 들기 때문에 그 자체로 비용을 지불하는 것보다 더 많은 비용을 지불합니다(3개 테이블을 모두 수용할 수 있는 충분한 메모리가 있다고 가정).
아래 코드(두 그룹을 허용하기 위해 Jim의 코드를 약간 수정함)는 100K 행과 1K 열에 대해 약 2.5초 만에 실행된 반면, 제가 처음 제출한 루틴은 6초 이상 걸렸습니다.
당신의 크기의 테이블에서는 여전히 약간 느린 것처럼 보일 것입니다. 다른 사람이 더 나은 아이디어를 가지기를 바랍니다.
Names Default To Here( 1 );
dt = current datatable();
dtcol1 = column(dt, 1);
dt1 = dt << subset(rows(dt<<GET rows="" where="">= 1, i--,
If( (Col Std Dev( Column( dt1, colList[i] ) ) ) != 0 & Col Std Dev( Column( dt2, colList[i] ) ) != 0,
colList = Remove( colList, i, 1 )
)
);
// Delete the columns with no variance
dt<<DELETE columns=""></DELETE></GET>
Re: 빅데이터 / Zero Variance로 인한 자동 열 제거알투그,
귀하의 문제를 올바르게 이해한 경우:
- 2개의 값(예: "A" 및 "B")이 있는 열(예: Group이라는 이름)이 있습니다.
- 숫자 데이터가 포함된 열이 2000개 있습니다.
- "A" 그룹에 속하는 행의 표준 편차가 있거나 "B" 그룹에 속하는 행이 특정 임계값(또는 둘 다)보다 낮은 열을 삭제하려고 합니다.
성능(및 메모리 사용량)은 해당 크기의 테이블에서 문제가 될 것입니다. 아래 내용이 귀하가 가지고 있는 크기의 테이블에서 작동하는지 또는 빠르게 작동하는지 확신할 수 없지만 시도해 보십시오.
먼저 "a/b" 열이 첫 번째 열이고 나머지 열이 관심 매개변수 열인 테이블을 만듭니다.
그럼 이것을 시도해 보세요.<BR />
건배,
브래디
dt = Current Data Table();
mat = dt << Get All Columns As Matrix(); //this get the A/B column as 1s and 2s. which is which not important.
//create subtables... note A & B will be reversed if B occurs first in dt; the result is unaffected.
matA = mat[loc(mat[0,1]==1), 0];
matB = mat[loc(mat[0,1]==2), 0];
//compute stddevs for each column in each subtable
stdvA = vstd(matA);
stdvB = vstd(matB);
//locate columns of sufficiently low variance
cols = loc(stdvA == 0 | stdvB == 0);
//delete them. Ignore row (1) of the cols vector; it is 1 (corresponding to column 1 in dt).
try(dt << delete columns((dt << get column names)[cols[2::nrow(cols)]]));
Re: 빅데이터 / Zero Variance로 인한 자동 열 제거다음은 원하는 작업을 수행하는 간단한 예제 스크립트입니다.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\semiconductor capability.jmp" );
// Get all continuous data columns
colList = dt << get column names( numeric, continuous );
// Loop across all columns and find those with no variance
For( i = N Items( collist ), i >= 1, i--,
If( Col Std Dev( Column( dt, colList[i] ) ) != 0,
colList = Remove( colList, i, 1 )
)
);
// Delete the columns with no variance
dt<<DELETE columns=""></DELETE>