데이터 열에서 하위 집합의 평균을 빼는 공식은 무엇입니까?지정된 조건과 일치하는 행만 사용하는 데이터 테이블의 하위 집합을 가져와 열에서 해당 행의 평균을 빼는 방법을 찾고 있습니다.
예를 들어 Big Class 데이터 세트를 사용하여 다음을 표시하는 새 열을 만들고 싶다고 가정해 보겠습니다. "이 학생과 같은 성별의 평균 14세 학생의 키 차이입니다."
이를 수행하는 방법을 아는 방법은 테이블 -> 요약 -> 통계: 평균(키), 그룹: 성별, 하위 그룹: 연령을 사용하여 두 번째 테이블을 추가하는 것입니다. 그런 다음 테이블 -> 업데이트: Big Class By (sex), 일치 열: sex = sex를 수행하면 평균(신장, [나이])에 대한 여러 열이 추가됩니다. 그런 다음 :height - :Mean(height, 14)인 "델타 키 대 동성 14yo"라는 새 열을 만들 수 있습니다.
내 질문: 추가 테이블과 추가 열(예: "평균(높이, 14)")을 만들지 않고 작업을 수행할 수 있는 방법이 있습니까? Col Mean(x, byVar)은 이 기능을 제공하는 데 가깝지만 다른 그룹을 선택하는 기능이 부족한 것 같습니다. 예를 들어 :height - Col Mean(:height, :age, :sex)을 사용하여 학생 X와 평균 학생의 성별 및 키 사이의 델타를 찾을 수 있지만 지정할 방법이 있는지는 모르겠습니다. in Col은 해당 행과 관련된 연령 값을 사용하는 대신 age=14인 행만 고려하고 싶다는 의미입니다.
저는 이러한 유형의 정규화를 매우 자주 수행하므로 더 빠르고 쉽게 만들 수 있는 모든 것이 있으면 매우 감사하겠습니다!
데이터 혼합 및 정리Re: 데이터 열에서 하위 집합의 평균을 빼는 공식은 무엇입니까?아름다운! 감사해요!!!
Re: 데이터 열에서 하위 집합의 평균을 빼는 공식은 무엇입니까?안녕 @MarkJSchwab ,
예, 이것을 조건부로 래핑하는 것이 많은 경우에 이상적이지 않을 수 있다는 것을 알 수 있습니다. 여기에 수정 사항이 있습니다. @brady_brady 작동해야 하는 님의 솔루션(표 첨부):

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

보시다시피 모든 행은 14세를 하위 집합으로 사용하지만 어떤 성별 하위 집합은 현재 행의 성별 값에 따라 결정됩니다. 다양한 수준의 복잡성에 쉽게 적응할 수 있어야 합니다.
@줄리안
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: 데이터 열에서 하위 집합의 평균을 빼는 공식은 무엇입니까?안녕 @줄리안 도움에 다시 한번 감사드립니다!
마지막 주름: 이상적으로는 여자아이에서 평균 14세 여자나이를 빼고, 남자아이에서 평균 14세 남자나이를 빼고 싶습니다. (귀하의 예에서는 남자와 여자 모두에서 14세 여자 나이를 뺍니다.)
(이 특정 사례에서는 M/F만 사용하는 것이 조건을 사용하는 것이 쉬울 것이라는 것을 알고 있습니다. "If :sex == 'F'라면 이 공식을 사용하고, :sex == 'M'이면 공식을 다음과 같이 수정합니다. {mean(:height[(:height << get datatable) << get row where( :age == 14 & :sex == "M" )])}"라고 말하지만 보다 일반적인 사용 사례에서는 많은 수의 그룹과 중첩된 조건문은 다루기가 어려워집니다.)
이를 달성하는 간단한 방법이 있습니까?
Re: 데이터 열에서 하위 집합의 평균을 빼는 공식은 무엇입니까?안녕 @MarkJSchwab ,
<
jmp 마법사의 솔루션은 다음과 같습니다. @brady_brady :
:height - Mean( :height[(:height << get datatable) << get rows where( :age == 14 )] )

나중에 유용하게 사용할 수 있는 몇 가지 방법이 있기 때문에 잠시 시간을 내어 이 공식을 풀어볼 가치가 있습니다.
(:height << get datatable) << get rows where( :age == 14 )
:age==14인 행 항목의 행렬을 반환합니다. 중요한 것은 다른 변수를 포함해야 한다고 생각하는 두 번째 질문을 포함하여 원하는 조회와 일치하도록 get 행 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에서 작동하므로 모두 함께 더 나은 솔루션이라고 생각합니다. 감사해요, @brady_brady !
@줄리안
Re: 데이터 열에서 하위 집합의 평균을 빼는 공식은 무엇입니까?안녕 @줄리안 , 제안해주셔서 감사합니다. 불행히도 정확한 수식을 붙여 넣으면
Col Mean( :height, <<FREQ></FREQ>
내 빅 클래스에서는 64.166이라는 올바른 값 대신 62.55(즉, 연령=14를 선택하지 않은 전체 Col Mean)를 반환합니다.
첨부 파일을 다운로드할 수도 있으며 "연령==14의 평균을 기준으로 중심" 열에 적절한 값이 표시됩니다. 그러나 동일한 수식을 사용하여 해당 테이블에 새 열을 만들면 다른 값이 반환됩니다([높이] - [14yo의 평균 높이]가 제대로 표시되는 대신 [높이] - [전체 평균 높이] 표시).
JMP Pro 14.3.0을 사용하고 있습니다. 내 출력을 귀하의 출력과 일치시킬 수 있는 방법에 대한 아이디어가 있습니까?
그리고 시트에 :sex의 byVar를 추가하면(전체 공식 ":height - (Col Mean( :height, :sex, <Re: 데이터 열에서 하위 집합의 평균을 빼는 공식은 무엇입니까?
안녕 @MarkJSchwab ,
Col Mean()을 사용하여 이 작업을 수행하는 간단한 방법이 있는데 직접 보기 전까지는 명확하지 않습니다. Col Mean()은 Frequency 열 인수를 사용합니다.

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

그러면 다음이 반환됩니다.

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


이게 도움이 되길 바란다!
@줄리안
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 학습을 위한 몇 가지 훌륭한 리소스가 있습니다!
행운을 빌어요!