循環中預先評估的統計數據(Col Mean、Col Median)你好,
我正在嘗試按組別計算 JSL 中多列的標準差的平均值和中位數。 我正在使用的數據表如下所示並附後。 我已經驗證了值右側列中的計算是否正確,但 JSL 輸出並不完全匹配。 下面的程式碼正確計算了兩個值的組別標準差平均值,但中位數僅正確計算了第一個值;第二個值的中位數結果與第一個值的計算結果完全相同。 我無法弄清楚為什麼平均值在循環中正確更新,但中位數沒有正確更新。 感謝任何對此的幫助,請讓我知道 JSL 中執行此操作的最佳方法是什麼。

傑士林:
For( i = 2, i < 4, i++,
N = Column Name( i );
Print( "i = " || Char( i ) );
Print( "Column Name = " || Char( Column Name( i ) ) );
Print( "Column Mean Std Dev by Group = " || Char( Col Mean( Col Std Dev( N, :Group ) ) ) );
Print( "Column Median Std Dev by Group = " || Char( Col Median( Col Std Dev( N, :Group ) ) ) );
);
JSL 輸出:
"i = 2"
"Column Name = Value 1"
"Column Mean Std Dev by Group = 3.9849040980727"
"Column Median Std Dev by Group = 3.60555127546399"
"i = 3"
"Column Name = Value 2"
"Column Mean Std Dev by Group = 5.14008843607314"
"Column Median Std Dev by Group = 3.60555127546399"
JMP 專業版 v16
謝謝
資料混合與清理回覆:循環中預先評估的統計數據(Col Mean、Col Median)您仍然可以循環它,但使用 Summarize 而不是函數 Col 函數,這可能不適用於 byVar。 這是一種選擇:
Names Default To Here(1);
dt = Current Data Table();
col_list = {"Value 1", "Value 2"};
For Each({col_name}, col_list,
Summarize(dt, groups = By(:Group), v_std = StdDev(Eval(col_name)));
Show(col_name, v_std);
Show(Mean(v_std));
Show(Median(v_std));
);
這是可以使用匯總表的其他選項(兩種計算方式):
Names Default To Here(1);
dt = Current Data Table();
col_list = {"Value 1", "Value 2"};
dt_summary = dt << Summary(
Group(:Group),
Std Dev(EvalList({col_list})),
Freq("None"),
Weight("None"),
statistics column name format("column"),
Link to original data table(0),
invisible
);
For Each({col_name}, col_list,
mea = Mean(dt_summary[0, col_name]);
med = Median(dt_summary[0, col_name]);
// or
mea1 = Col Mean(As Column(col_name));
med1 = Col Median(As Column(col_name));
Show(col_name, mea, med, mea1, med1);
);
Close(dt_summary, no save);
回覆:循環中預先評估的統計數據(Col Mean、Col Median)我同意,這看起來是處理這個問題的正確方法。 但是,它依賴於鍵入所有列名稱。 有沒有辦法在不知道列名的情況下將其推廣到許多列? 這是在我的程式碼中使用 For 循環的主要原因。
回覆:循環中預先評估的統計數據(Col Mean、Col Median)總結在這裡應該可以很好地工作:
Names Default To Here(1);
dt = Current Data Table();
Summarize(dt, groups = By(:Group), v1_std = StdDev(:Value 1), v2_std = StdDev(:Value 2));
Show(groups, v1_std, v2_std);
Show(Mean(v1_std));
Show(Mean(v2_std));
Show(Median(v1_std));
Show(Median(v2_std));<BR /><BR />/*groups = {"A", "B", "C", "D"};<BR />v1_std = [3.60555127546399, 2.64575131106459, 3.60555127546399, 6.08276253029822];<BR />v2_std = [7.23417813807024, 8.9628864398325, 0.577350269189626, 3.78593889720018];<BR />Mean(v1_std) = 3.9849040980727;<BR />Mean(v2_std) = 5.14008843607314;<BR />Median(v1_std) = 3.60555127546399;<BR />Median(v2_std) = 5.51005851763521;*/回覆:循環中預先評估的統計數據(Col Mean、Col Median)以這種方式執行計算的原因是我想將結果提供給一個腳本,該腳本單獨繪製每列中的數據,並使用計算值作為繪圖上限和下限。
回覆:循環中預先評估的統計數據(Col Mean、Col Median)是否有理由使用循環和公式執行這樣的計算? JMP 確實為您提供了摘要(表格)、匯總和製表,這可能是更好的選項,具體取決於您想要執行的操作。
對於循環,我不確定你是否真的可以(或是否應該)循環 Col 函數,就像使用 byVar 一樣,因為它們的評估會有點奇怪。
