일별 값의 모드를 찾는 공식안녕,
해당 샘플 내의 다른 시스템 컬렉션에 대해 서로 다른 매개변수를 추적하는 여러 샘플이 있는 데이터 테이블이 있습니다(1 샘플에는 1 시스템이 있지만 다른 샘플에도 동일한 시스템이 있을 수 있음). 각 샘플은 끝에 접근함에 따라 다른 상태를 갖습니다. 이러한 상태는 내가 예측하려고 하는 것입니다. 별도의 데이터 테이블에서 몇 가지 다른 샘플을 사용하여 의사 결정 트리 알고리즘을 만든 다음 이 데이터 테이블에 추가했습니다. 이 의사 결정 트리가 하려고 하는 것은 서로 다른 시점에서 시스템의 상태를 예측하는 것입니다. 그런 다음 이 시점에서 시스템의 알려진 상태에 대해 이러한 예측 상태를 측정합니다(알고리즘은 다른 샘플로 생성되었으므로 "신선한" 데이터임).
이제 하루 중 상상할 수 있듯이 이 수식은 수백 또는 수천 개의 서로 다른 예측을 보낼 수 있으며 모두가 정확하지 않으므로 샘플 번호 및 날짜별로 이러한 모든 예측을 볼 수 있는 열 수식이 필요합니다. , 가장 일반적으로 예측되는 장비 상태를 출력합니다(Mode).
즉, 각 데이터 샘플의 각 날짜에 대한 모드 경보 등급을 계산하고 예측된 경보 등급을 이러한 각 행에 출력하는 열을 원합니다.
내가 첨부한 예제 데이터 테이블에서 "오늘의 경고 예측"이라는 제목의 열을 자동화할 수 있는 수식을 원합니다. LogTime 열이나 시작 후 시간 열을 사용하여 일일 예측을 생성해도 상관 없습니다.
당신의 도움을 주셔서 감사합니다
Re: 일별 값의 모드를 찾는 공식정말 감사합니다, 나는 지금 잠시 동안 이것을 하는 방법을 알아내기 위해 고심하고 있습니다.
내가 가지고 있는 다른 프로젝트에 맞게 조정할 수 있도록 작동 방식에 대해 자세히 알아볼 것입니다. 내 데이터 세트에서 작동하도록 하려면 이미 약간 수정해야 했기 때문에 어느 것이 좋은지 이미 이해하기 시작했습니다. 하지만 아직 더 배워야 할
도움을 주셔서 다시 한 번 감사드립니다.
Re: 일별 값의 모드를 찾는 공식귀하의 경우에만 해당된다는 점을 염두에 두십시오. 이렇게 해야 합니다. '도움말 > 스크립팅 색인' 및 편집기 도구 설명을 사용하여 작동 방식을 이해할 수 있습니다.
NamesDefaultToHere(1);
// Starting table
dt = DataTable("Example Datatable for Summarising Alert Ratings.jmp");
// Add required columns
dt << NewColumn("Date", Character, Formula(Short Date( :Logtime )));
dt << NewColumn("Group", Character, Formula((:System || " ") || :Date));
// Find the mode of :Decision Tree Prediction for each level in :Group, and fill in 'modeVals'
vals = Column(dt, "Decision Tree Prediction") << getValues;
gVals = Column(dt, "Group") << getValues;
levs = AssociativeArray(gVals) << getKeys;
modes = J(NItems(levs), 1, .);
modeVals = J(NRow(dt), 1, .);
for(i=1, i<=NItems(levs), i++,
rows = Loc(AsList(gVals), levels[i]);
modes[i] = Mode(vals[rows]);
modeVals[rows] = modes[i];
);
// Build the final column in dt using 'modeVals'
vl = Column(dt, "Decision Tree Prediction") << getProperty("Value Labels");
nc = dt << NewColumn("Modes for Decision Tree Prediction", Numeric, Nominal, Values(modeVals));
nc << valueLabels(Arg(vl, 1));
Re: 일별 값의 모드를 찾는 공식shortdate* 죄송합니다. 단축 코드가 아닙니다.
Re: 일별 값의 모드를 찾는 공식따라서 효과적인 논리는 다음과 같습니다.
각 샘플에 대해 -> 날짜로 분할합니다(날짜/시간 열 또는 각 행에 대해 이 특정 샘플의 시작 이후 일수가 있는 이미 생성한 열을 사용할 수 있습니다. 예 감사합니다. 단축 코드를 사용하면 날짜를 더 쉽게 그룹화할 수 있습니다.)
그런 다음 각 샘플에 대해 경보 상태를 예측하는 열을 살펴본 다음 해당 샘플의 매일 모든 예측을 보고 이에 대한 모드 값(서수)을 찾습니다. 그런 다음 해당 출력 모드 값을 가져와서 해당 샘플의 해당 날짜에 대한 새 열의 각 행에 있는 데이터 테이블에 다시 삽입합니다(따라서 내가 원래 수식으로 원했던 이유). 데이터 테이블을보고 이것을 읽을 때 더 명확하다고 생각합니다.
그게 좀 더 이해가 되는 데 도움이 되나요?
Re: 일별 값의 모드를 찾는 공식내가 올바르게 이해했다면 'Logtime'의 '날짜 부분'과 결합된 'System'의 각 값에 대한 그룹을 정의하려고 합니다(이를 새 열로 가져오기 위해 'ShortDate()' 함수를 사용할 수 있음).
그런 경우 위의 코드를 일반화하여 둘 이상의 'by' 변수로 작업할 수 있습니다. 그렇지 않으면 (아마도 더 간단함) 두 개의 문자 열을 함께 연결하고 이것을 사용하여 그룹을 정의할 수 있습니다. 마지막으로 지적했듯이 'gVals'가 문자일 때 작동하도록 코드를 조정해야 합니다. 아마도:
NamesDefaultToHere(1);
ClearLog();
// Given a set of values ('vals') and group membership ('gVals'),
// returns the distinct levels in 'gVals' and the mode of each group
modeWithBy =
Function({vals, gVals}, {Default Local},
levs = AssociativeArray(gVals) << getKeys;
modes = {};
for(i=1, i<=NItems(levs), i++, InsertInto(modes, Mode(vals[Loc(AsList(gVals), levs[i])])));
EvalList({levs, modes});
);
l = [1, 2, 1, 1, 2, 2, 3];
g = {"1", "1", "1", "1", "2", "2", "2"};
Print(modeWithBy(l, g));
Re: 일별 값의 모드를 찾는 공식
@ian_jmp 썼다:
두 열이 모두 숫자인 경우 다음과 같이 할 수 있습니다.
NamesDefaultToHere(1);
ClearLog();
// Given a set of values ('vals') and group membership ('gVals'),
// returns the distinct levels in 'gVals' and the mode of each group
modeWithBy =
Function({vals, gVals}, {Default Local},
levs = AssociativeArray(gVals) << getKeys;
modes = J(NItems(levs), 1, .);
for(i=1, i<=NItems(levs), i++, modes[i] = Mode(vals[Loc(AsList(gVals), levs[i])]));
EvalList({levs, modes});
);
l = [1, 2, 1, 1, 2, 2, 3];
g = [1, 1, 1, 1, 2, 2, 2];
Print(modeWithBy(l, g));
"샘플" 그룹은 연속적으로 만들 수 있지만 확실히 명목 데이터 세트입니다. 그룹 시스템은 값 레이블을 사용하지 않고 연속적으로 만들 수 없으며 명목 데이터 세트이기도 합니다. 그러면 이것이 모든 그룹(시스템 및 샘플)에 대한 모드를 찾기 위해 구성한 다음 각 조합에 대한 데이터를 매일 기준으로 구성하는 것과 어떤 관련이 있습니까?
또한 이 값을 데이터 테이블에 다시 병합하여 매일 예상되는 경고가 무엇인지 확인할 수 있기를 바랍니다.
당신의 도움을 주셔서 감사합니다
Re: 일별 값의 모드를 찾는 공식"샘플" 그룹은 연속적으로 만들 수 있지만 확실히 명목 데이터 세트입니다. 그룹 시스템은 값 레이블을 사용하지 않고 연속적으로 만들 수 없으며 명목 데이터 세트이기도 합니다. 그러면 이것이 모든 그룹(시스템 및 샘플)에 대한 모드를 찾기 위해 구성한 다음 각 조합에 대한 데이터를 매일 기준으로 구성하는 것과 어떤 관련이 있습니까?
또한 이 값을 데이터 테이블에 다시 병합하여 매일 예상되는 경고가 무엇인지 확인할 수 있기를 바랍니다.
당신의 도움을 주셔서 감사합니다
Re: 일별 값의 모드를 찾는 공식두 열이 모두 숫자인 경우 다음과 같이 할 수 있습니다.
NamesDefaultToHere(1);
ClearLog();
// Given a set of values ('vals') and group membership ('gVals'),
// returns the distinct levels in 'gVals' and the mode of each group
modeWithBy =
Function({vals, gVals}, {Default Local},
levs = AssociativeArray(gVals) << getKeys;
modes = J(NItems(levs), 1, .);
for(i=1, i<=NItems(levs), i++, modes[i] = Mode(vals[Loc(AsList(gVals), levs[i])]));
EvalList({levs, modes});
);
l = [1, 2, 1, 1, 2, 2, 3];
g = [1, 1, 1, 1, 2, 2, 2];
Print(modeWithBy(l, g));Re: 일별 값의 모드를 찾는 공식원래는 공식으로 가려고 했으나 확실히 당신의 요점을 보았고 전반적으로 더 효율적인 솔루션이 확실히 최고일 것이라고 생각합니다. 그래서 예 스크립트가 정말 유용할 것입니다 감사합니다
Re: 일별 값의 모드를 찾는 공식솔루션은 공식이어야 합니까 아니면 계산을 수행하고 결과를 원래 테이블에 다시 결합하는 스크립트를 사용할 수 있습니까? 내가 묻는 이유는 수식을 사용하는 것이 각 행에서 수행할 모든 복제 작업으로 인해 몇 배는 덜 효율적이라고 믿기 때문입니다.