Mode of Daily 値を求める式やあ、
サンプル内のさまざまなシステムのコレクションのさまざまなパラメーターを追跡する複数のサンプルを持つデータテーブルがあります (1 つのサンプルには 1 つのシステムがありますが、別のサンプルにも同じシステムがある場合があります)。 各サンプルは、終了に近づくにつれて異なる状態になります。 これらの状態は、私が予測しようとしているものです。 別のデータテーブルでいくつかの異なるサンプルを使用して決定木アルゴリズムを作成し、それをこのデータテーブルに追加しました。 この決定木がしようとしているのは、さまざまな時点でのシステムの状態を予測することです。 次に、これらの時点でのシステムの既知の状態に対してこれらの予測された状態を測定します (アルゴリズムはさまざまなサンプルで作成されているため、これは「新鮮な」データです)
想像できるように、1 日の間にこの数式は数百または数千の異なる予測を送信する可能性があり、それらのすべてが正しいわけではないため、これらすべての予測をサンプル数および日別に表示できる列数式が必要です。 、最も一般的に予測される機器の状態 (モード) を出力します。
言い換えれば、データの各サンプルの各日のモード アラート評価を計算し、予測されたアラート評価をこれらの行のそれぞれに出力する列が必要です。
添付したデータテーブルの例では、「その日のアラート予測」というタイトルの列を自動化できる数式が必要であり、LogTime 列または起動列からの時間を使用して毎日の予測を作成してもかまいません。
ご協力いただきありがとうございます
Re: 毎日の値のモードを見つける式どうもありがとう、私はしばらくこれを行う方法を考え出すのに苦労していました.
私はそれがどのように機能するかについてもっと学び、私が持っている他のプロジェクトに合わせて調整できるようにします. データセットで動作させるには、すでに少し調整する必要があったため、どちらが良いかをすでに理解し始めています。 しかし、学ぶべきことはまだまだあります
ご協力ありがとうございました
Re: 毎日の値のモードを見つける式それはあなたのケースにかなり固有のものであることを念頭に置いて、これでうまくいくはずです。 「Help > Scripting Index」とエディターのツールチップを使用して、その仕組みを理解することができます。
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: 毎日の値のモードを見つける式事実上、ロジックは次のようになります。
各サンプルについて -> それらを日数に分割します (datetime 列を使用するか、この特定のサンプルの開始からの日数を行ごとに持つ、既に作成した列を使用できます。 はい、ありがとうございます。ショートコードを使用すると、日数のグループ化が容易になる場合があります)
次に、各サンプルについてアラート状態を予測している列を見て、そのサンプルの毎日について、行われたすべての予測を見て、そのモード値 (序数) を見つけます。 次に、その出力モードの値を取得し、そのサンプルのその日の新しい列の各行のデータテーブルに挿入します (そのため、最初は数式として使用したかったのです)。 データテーブルを見てこれを読むとより明確になると思います
それはもう少し理にかなっていますか?
Re: 毎日の値のモードを見つける式私の理解が正しければ、「System」の各値と「Logtime」の「日付部分」を組み合わせたグループを定義する必要があります (おそらく、「ShortDate()」関数を使用してこれを新しい列に取得します)。
その場合は、上記のコードを一般化して複数の 'by' 変数を操作するか、または (おそらくもっと単純に) 2 つの文字列を連結し、これを使用してグループを定義することができます。 最後に、ご指摘のとおり、「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));
グループ「Sample」は連続的にすることができますが、それは間違いなく名目上のデータセットです。 グループ System は、値ラベルを使用せずに連続化することはできず、名義データセットでもあります。 これは、すべてのグループ (システムとサンプル) のモードを見つけて整理し、それらの組み合わせごとにデータを日ごとに整理することにどのように関連しますか?
また、これらの値をデータテーブルにマージして、予測されたアラートが日ごとに何であるかを確認できるようにしたいと思います
ご協力いただきありがとうございます
Re: 毎日の値のモードを見つける式グループ「Sample」は連続的にすることができますが、それは間違いなく名目上のデータセットです。 グループ System は、値ラベルを使用せずに連続化することはできず、名義データセットでもあります。 これは、すべてのグループ (システムとサンプル) のモードを見つけて整理し、それらの組み合わせごとにデータを日ごとに整理することにどのように関連しますか?
また、これらの値をデータテーブルにマージして、予測されたアラートが日ごとに何であるかを確認できるようにしたいと思います
ご協力いただきありがとうございます
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: 毎日の値のモードを見つける式解決策は数式である必要がありますか?それとも、計算を実行して結果を元のテーブルに結合するスクリプトを使用できますか? 私が尋ねる理由は、各行が実行するすべての複製作業のために、数式を使用すると効率が何倍も低下すると考えているからです。