데이터 열에서 하위 집합의 평균을 빼는 공식?지정된 조건과 일치하는 행만 사용하는 데이터 테이블의 하위 집합을 가져와 열에서 해당 행의 평균을 빼는 방법을 찾고 있습니다.
예를 들어 Big Class 데이터 세트를 사용하여 다음을 표시하는 새 열을 만들고 싶다고 가정합니다. "이 학생과 동성 평균 14 세 사이의 키 차이."
이 작업을 수행하는 방법을 아는 방법은 테이블-> 요약-> 통계 : 평균 (높이), 그룹 : 성별, 하위 그룹 : 연령을 사용하여 두 번째 테이블을 추가하는 것입니다. 그런 다음 Table-> Update : Big Class By (sex), Match columns : sex = sex, 그러면 Mean (height, [age])에 대한 여러 열이 추가됩니다. 그런 다음 "Delta height vs 14yo of same sex"라는 새 열을 만들 수 있습니다. 즉, : height-: Mean (height, 14)입니다.
내 질문 : 추가 테이블과 추가 열 (예 : "Mean (height, 14)")을 생성하지 않고 할 수있는 방법이 있습니까? Col Mean (x, byVar)이이 기능을 제공하는 데는 가깝지만 다른 그룹을 선택하는 기능이 부족한 것 같습니다. 예를 들어 : height-Col Mean (: height, : age, : sex)를 사용하여 학생 X와 자신의 성별과 키의 평균 학생 사이의 델타를 찾을 수 있지만 지정하는 방법이 있는지 모르겠습니다. in Col은 해당 행과 관련된 연령 값을 사용하는 대신 age = 14 인 행만 고려하고 싶다는 의미입니다.
저는 이러한 유형의 정규화를 매우 자주 수행하므로 더 빠르고 쉽게 만들 수있는 모든 것이 대단히 감사하겠습니다!
데이터 테이블Re : 데이터 열에서 하위 집합의 평균을 빼는 공식?안녕하세요, MarkJSchwab!
물론 원하는 것을 할 수있는 방법이 있습니다.JSL이 당신을 자유롭게 해줄 것입니다!
주로 JSL의 기능을 사용하여 스크립트를 작성하는 간단한 스크립트를 작성했습니다.시도 해봐:
// Title: Bigclass Normalization Script for JMP User Community discussion
// Purpose: Demonstrate how to write a very basic script to do "normalizations"
Names Default To Here( 1 );
Bigclass_dt = Open( "$SAMPLE_DATA\Big Class.jmp" );
BigclassSummary_dt = bigclass_dt << Summary( Group( :age, :sex ), Mean( :height ) );
BigclassSummary_dt << Select Where( :Age != 14 ) << Delete Rows;
Bigclass_dt << Join(
With( BigclassSummary_dt ),
Select( :name, :age, :sex, :height ),
SelectWith( :Name( "Mean(height)" ) ),
By Matching Columns( :sex = :sex ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 ),
Output Table( "NormedBigclass by AgeGender" )
);
BigclassJoin_dt = Data Table( "NormedBigclass by AgeGender" ) << New Column( "Normalized",
numeric,
continuous,
Formula( :Name( "height" ) - :Name( "Mean(height)" ) ),
evalFormula
);
Close( BigclassSummary_dt, NoSave );
별도의 요약 테이블을 만든 다음 닫았지만 그렇게 할 필요는 없습니다.
물론 이와 같은 스크립트를 작성하는 더 정교한 방법이 있습니다. 특히 모든 "where"절이 하드 코딩되어 있고 데이터 테이블이 크지 만 여전히 JSL 인 경우이 스크립트에 문제가 발생할 수 있기 때문입니다. 생산성으로가는 길이 될 것입니다.JSL 학습을위한 몇 가지 훌륭한 리소스가 있습니다!
행운을 빕니다!
Re : 데이터 열에서 하위 집합의 평균을 빼는 공식?안녕 뿡 빵뀨 ,
Col Mean ()을 사용하여 이것을 수행하는 간단한 방법이 있습니다. 이것은 당신이 볼 때까지 분명하지 않습니다. Col Mean ()은 Frequency 열 인수를 사용합니다.

일반적으로 다른 열을 사용하여 가중치를 부여해야 할 때 사용됩니다. 그러나 귀하의 예에서 Age == 14 값을 1로 가중치를 부여하고 다른 모든 값을 0으로 가중치를 부여 할 수 있다면 어떨까요? 이는 Age == 14 인 개인의 평균을 제공합니다. 공식에서 직접 할 수 있습니다.
Col Mean( :height, <<FREQ></FREQ>

다음을 반환합니다.

이제 특정 질문에 대해이 특정 높이의 평균을 중심으로 일반적인 방식으로 수식에 래핑 할 수 있습니다.
:height - (Col Mean( :height, <<FREQ></FREQ>


이게 도움이 되길 바란다!
줄리아
Re : 데이터 열에서 하위 집합의 평균을 빼는 공식?안녕 줄리아 , 제안 해 주셔서 감사합니다. 불행히도 정확한 공식을 붙여 넣으면
Col Mean( :height, <<FREQ></FREQ>
내 Big Class에 64.166이라는 올바른 값 대신 62.55 (즉, age = 14를 선택하지 않은 전체 Col Mean)를 반환합니다.
첨부 파일을 다운로드 할 수도 있으며 "연령대 평균 == 14"열에 적절한 값이 표시됩니다. 그러나 정확히 동일한 공식으로 해당 테이블에 새 열을 만들면 다른 값이 반환됩니다 ([높이]-[평균 높이 14yos] 대신 [높이]-[전체 평균 높이] 표시).
JMP Pro 14.3.0을 사용하고 있습니다. 내 결과물을 귀하의 결과물과 일치시킬 수있는 방법에 대한 아이디어가 있습니까?
그리고 시트에 추가 byVar of : sex (총 공식 ": height-(Col Mean (: height, : sex, << Freq (: age == 14)))"를 추가하면 시트에 남아에서 평균 14 세 남아 키를 빼고 여아에서 평균 14 세 여아 키를 뺀다?
Re : 데이터 열에서 하위 집합의 평균을 빼는 공식?안녕 뿡 빵뀨 ,
JMP 15에서는 << Freq가 선택적 인수로 추가 된 것처럼 보이므로 이전 버전의 JMP에서는 다른 작업을 수행해야합니다.
다음은 jmp 마법사의 솔루션입니다. 헉헉 :
:height - Mean( :height[(:height << get datatable) << get rows where( :age == 14 )] )

나중에 사용할 가치가 있다고 생각하는 몇 가지 방법이 있기 때문에이 공식의 포장을 풀기 위해 잠시 시간을 할애 할 가치가 있습니다.
(:height << get datatable) << get rows where( :age == 14 )
: age == 14 인 행 항목의 행렬을 반환합니다. 중요한 것은 get rows where () 함수를 수정하여 원하는 조회와 일치하도록 수정할 수 있습니다. 여기에는 다른 변수를 포함해야한다고 생각하는 두 번째 질문이 포함됩니다. 예를 들면 :
(:height << get datatable) << get rows where( :age == 14 & :sex == "F"

조건과 일치하는 행 행렬이 생겼으므로 Brady는이 행렬을 사용하여 : height를 첨자합니다.
height[(:height << get datatable) << get rows where( :age == 14 & :sex == "F" )]

그러면 각 행에 대한 : height 값의 행렬이 반환됩니다.이 경우 14 세 여학생의 키 : [61, 62, 65, 63, 62]
마지막으로 Mean () 함수는이 행렬을 둘러싸고 있으며, 이는 중심 변수를 계산하는 데 필요한 평균을 반환합니다.
mean(:height[(:height << get datatable) << get rows where( :age == 14 & :sex == "F" )])

이 솔루션은 더 유연하고 누락 된 데이터에 대한 내성이 있으며 이전 버전의 jmp에서 작동하므로 모두 함께 더 나은 솔루션이라고 생각합니다. 감사, 헉헉 !
줄리아
Re : 데이터 열에서 하위 집합의 평균을 빼는 공식?안녕 줄리아 도와 주셔서 다시 한번 감사드립니다!
마지막 주름 하나 : 이상적으로는 평균 14 세 소녀 연령을 소녀에서 빼고 평균 14 세 소년 연령을 소년에서 빼고 싶습니다. (귀하의 예에서는 남학생과 여학생 모두에서 14 세 여학생을 뺍니다.)
(나는 M / F만으로이 특정한 경우에 조건문을 사용하는 것이 쉬울 것이라는 것을 알고 "If : sex == 'F'이면이 수식을 사용하고, if : sex == 'M'이면 수식을 다음과 같이 수정합니다. 말 {mean (: height [(: height << get datatable) << get rows where (: age == 14 & : sex == "M")])} "하지만 더 일반적인 사용 사례에서는 많은 수의 그룹과 중첩 된 조건은 다루기 어려워집니다.)
이것을 달성하는 간단한 방법이 있습니까?
Re : 데이터 열에서 하위 집합의 평균을 빼는 공식?남성과 여성 모두를 처리 할 수 있도록 공식을 확장하면됩니다.
If( :sex == "F",
:height - Mean( :height[(:height << get datatable) << get rows where( :age == 14 & :sex == "F" )] ),
:height - Mean( :height[(:height << get datatable) << get rows where( :age == 14 & :sex == "M" )] )
)
Re : 데이터 열에서 하위 집합의 평균을 빼는 공식?안녕 뿡 빵뀨 ,
예, 이것을 조건문으로 래핑하는 것이 많은 경우에 이상적이지 않을 수 있음을 알 수 있습니다. 다음은 수정 사항입니다. 헉헉 작동해야하는 솔루션 (표 첨부) :

testVal = :sex;
:height - Mean( :height[(:height << get datatable) << get rows where( :age == 14 & :sex == testVal )] );
이 경우 현재 행의 : sex 값을 가져 와서 testVal 변수에 저장합니다. 그런 다음 센터링 함수를 평가할 때 get rows where () 함수에서 해당 값을 사용하여 테스트 할 수 있습니다.
다음은이 Get Rows Where () 함수에 의해 선택된 행의 열만있는 테이블입니다.

보시다시피 모든 행은 14 세를 하위 집합으로 사용하지만 성별 하위 집합은 sex의 현재 행 값에 의해 결정됩니다. 다양한 수준의 복잡성에 쉽게 적용 할 수 있어야합니다.
줄리아