創建具有 byVar 的統計自定義(公式)函數與我創建的這個願望清單項目相關:添加歸一化和穩健的統計函數(和矩陣函數) . 我想我現在可以嘗試將它們編寫為自定義函數(即使我知道不可能共享它們並為每個人更新它們),但我幾乎立即遇到了我的第一個問題:如何引用列...... 使用自定義公式時,我是否堅持使用行級計算或將列引用為字符串而不是 :colname,這會阻止我直接從公式編輯器中使用它們。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
my_min = New Custom Function(
"custom",
"My Min1",
Function({x, y},
As Constant(
vals = Column(x) << get values;
groups = Column(y) << get values;
);
cur_group = Loc(groups, As Column(y));
vals[cur_group[Loc Min(vals[cur_group])]];
),
<< Formula Category("Statistical")
);
Add Custom Functions(my_min);
my_min = New Custom Function(
"custom",
"My Min2",
Function({x, y},
Col Minimum(Column(x), Column(y));
),
<< Formula Category("Statistical")
);
Add Custom Functions(my_min);
my_min = New Custom Function(
"custom",
"My Min3",
Function({x, y},
Col Minimum(x, y);
),
<< Formula Category("Statistical")
);
Add Custom Functions(my_min);
dt << New Column("ColMin", Numeric, Continuous, Formula(Col Minimum(:height, :sex)));
dt << New Column("MyMin1_str", Numeric, Continuous, Formula(custom:My Min1("height", "sex")));
dt << New Column("MyMin2_str", Numeric, Continuous, Formula(custom:My Min2("height", "sex")));
dt << New Column("MyMin3_str", Numeric, Continuous, Formula(custom:My Min3("height", "sex")));
dt << New Column("MyMin1_ref", Numeric, Continuous, Formula(custom:My Min1(:height, :sex)));
dt << New Column("MyMin2_ref", Numeric, Continuous, Formula(custom:My Min2(:height, :sex)));
dt << New Column("MyMin3_ref", Numeric, Continuous, Formula(custom:My Min3(:height, :sex)));數據表腳本回复:創建具有 byVar 的統計自定義(公式)函數我相信會讓這件事變得容易得多的願望清單項目:
一次計算自定義列公式的選項或函數,或在行之間緩存值
回复:創建具有 byVar 的統計自定義(公式)函數兩條評論:
- 我似乎找不到對它的引用,但我確實記得有一次明確地告訴我,沒有辦法編寫一個自定義列公式來像內部公式那樣在行之間緩存它的值。因此,您需要編寫一個在每一行的上下文中進行計算的函數,這意味著它一次返回一個值。(如果可能的話,我希望有人在這裡糾正我。)
- JMP 在將列引用傳遞給函數之前對其進行求值(急切求值),這意味著您將獲得該行的值而不是整列的值。您需要告訴 JMP 傳遞對列的引用,您可以使用 Expr 來完成。
我相信這可以解決這兩個問題,但我不確定它是否非常直觀或用戶友好。
更新:自定義函數可以訪問行上下文,因此您可以跳過將當前行的值傳遞給函數的需要,就像在 Test2 中一樣。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
my_min = New Custom Function(
"custom",
"Test1",
Function({x,y,yval},
show(yval);
show(Name Expr(x)<< get values);
show(Loc(Name Expr(y) << Get Values, yval));
Min((Name Expr(x)<< get values)[Loc(Name Expr(y) << Get Values, yval)]);
),
<< Formula Category("Statistical")
);
Add Custom Functions(my_min);
custom:Test1(Expr(:age),Expr(:sex),"F");
dt << New Column("Test1", Numeric, Continuous, Formula(custom:Test1(Expr(:height), Expr(:sex), :sex)));
my_min = New Custom Function(
"custom",
"Test2",
Function({x,y},
xvals = Name Expr(x)<< get values;
yvals = Name Expr(y) << Get Values;
Min(xvals[Loc(yvals, yvals[row()])]);
),
<< Formula Category("Statistical")
);
Add Custom Functions(my_min);
dt << New Column("Test2", Numeric, Continuous, Formula(custom:Test2(Expr(:height), Expr(:sex))));回复:創建具有 byVar 的統計自定義(公式)函數好點子!我非常專注於獲取要評估的列引用,我什至沒有註意到這些值是荒謬的。我會再考慮的。
回复:創建具有 byVar 的統計自定義(公式)函數這似乎沒有提供正確的答案,因為它很可能是“逐行”而不是按列評估它們

回复:創建具有 byVar 的統計自定義(公式)函數這會做你想要的嗎?如果您希望函數參數是列引用,那麼您似乎需要顯式評估函數參數。
my_min = New Custom Function(
"custom",
"My Min4",
Function({x, y},
EvalExpr(Col Minimum(Expr(x), Expr(y)));
),
<< Formula Category("Statistical")
);
Add Custom Functions(my_min);