循环中的预评估统计数据(Col Mean、Col Median)你好,
我正在尝试按组计算 JSL 中多列的标准差的平均值和中位数。 我正在使用的数据表如下所示并附上。 我已经验证了值右侧列中的正确计算,但 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 Pro v16
谢谢
分析脚本回复:循环中的预评估统计数据(Col Mean、Col Median)是否有理由使用循环和公式执行这样的计算? JMP 确实为您提供了汇总(表格)、汇总和制表,这可能是更好的选择,具体取决于您要执行的操作。
对于循环,我不确定你是否真的可以(或者如果你应该)循环 Col 函数,比如 while 使用 byVar ,因为它们的评估会有点奇怪。

回复:循环中的预评估统计数据(Col Mean、Col Median)以这种方式执行计算的原因是我想将结果提供给脚本,该脚本分别绘制每列中的数据并将计算的值用于绘制上限和下限。
回复:循环中的预评估统计数据(Col Mean、Col Median)Summarize 在这里应该可以很好地工作:
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)我同意,这看起来是处理这个问题的正确方法。 但是,它依赖于输入所有列名。 有没有办法在不知道列名的情况下将它概括为许多列? 这是在我的代码中使用 For 循环的主要原因。
回复:循环中的预评估统计数据(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);