生成動態公式列所需的JSL代碼,該公式匯總列表中的列大家好,
這個問題與職位有關這裡很好地生成了一個非動態列,用於匯總其他列的列表。
我遇到的問題是,當您有N個其他列的列表並將其設為動態公式時,如何總結這些列(使用JSL)。
我在數據表中有一個列列表,例如ColList,我想用公式將新的列生成,該公式僅將ColList中的N個項目相加。 我在想的是這樣的:
Names Default to Here (1);
dt = Current Data Table();
dt << New Column("Sum", Formula(Sum(ColList)));這顯然不起作用,因為ColList是列列表:ColList = {“ col1”,“ col2”,...,“ colN”}。 我試圖製作一個字符串,並使用Eval(Parse())和Eval Insert()像這樣:
Names Default to Here (1);
dt = Current Data Table();
str = Eval Insert("dt << New Column(\!"Sum\!", Formula(Sum(Eval(ColList))));
Eval(Parse(str));但是仍然沒有運氣。 JSL代碼將使用公式生成列,但行值為空,因為它仍在公式中顯示Eval(ColList)而不是實際的公式,該公式應類似於:Sum(:col1,:col2,: col3,...,:colN)。
從列列表{“”}到對冒號:的列的引用,我無法弄清楚我在做什麼。
任何幫助深表感謝。
謝謝!,
DS
分析工具數據表腳本編寫回复:生成動態公式列所需的JSL代碼,該公式匯總列表中的列有幾種方法可以做到這一點。 我更喜歡使用EvalExpr()為所需的表達式創建一個變量,然後使用NameExpr()將(未求值的)表達式轉換為Formula()參數。
Names Default To Here( 1 );
dt = Open( "$Sample_Data/2D Gaussian Process Example.jmp" );
ColList = dt << Get Column Names;
F = Eval Expr( Sum( Expr( ColList ) ) );
dt << New Column( "Sum", Formula( Name Expr( F ) ) );
回复:生成動態公式列所需的JSL代碼,該公式匯總列表中的列你好@小姐,
那是一個完美的解決方案,謝謝! 我喜歡它是如此簡單和優雅。
我確實需要稍稍更改一下代碼,因為當列表的結構如{“ A”,“ B”,“ C”,...}時,按照您的方式進行操作仍然會遇到問題。 但是,如果列表的結構類似{A,B,C,...},那麼它對錶達式的求值就很好。 這兩個列表的生成略有不同,引號實際上使Eval()無效。
謝謝!,
DS
回复:生成動態公式列所需的JSL代碼,該公式匯總列表中的列你好@小姐,
我有一個相關的問題(因此沒有其他文章),希望您的腳本方法可以幫助您。 它與職位有關這裡。 我現在要做的基本上是將信息“饋送”到配置文件中的Simulator時,將原始文章中從4x4相關矩陣放到任意NxN矩陣中的內容一般化。
在其他原始帖子中,有可以生成NxN相關矩陣的腳本,並且可以從您的輸入中生成“預測”列(其他N列的總和)。 我遇到困難的地方如下:調用Simulator()函數時,需要通過以下步驟:
Simulator(狀態= 0 | 1,<因子(列<< Random()|固定的|(常數)| Expression()| Multivariate())>,<響應(列)<<無噪聲|添加隨機噪聲|添加隨機加權噪聲|添加多元噪聲),X相關(狀態= 0 | 1,{factor1,factor2,...,factorN},[NxN相關])>)
因此,從另一篇原始文章中,可以找到傳遞正確的因子列表(“ tpListY”)和相關矩陣(“ corr.mat”)的解決方案,該JSL代碼需要將Eval Insert()包裹在要發送的調用周圍將Simulator()添加到Profiler報告中,然後圍繞它運行一個Eval(Parse())。
現在的挑戰是如何正確地對此進行概括,以便在調用Simulator()並定義因子時,可以在該ColList上進行此操作。
ColList可能類似於:ColList = {A,B,C,D,...},並且每一列A,B,C,...都有相關的均值和標準差。
調用Simulator的正確語法是什麼,以便為每個因子插入正確的均值和Std Dev? 例子:
sim_design = Profiler(Y(:Pred), Invisible);
new = Eval Insert(
"sim_design << Simulator(
1,
Factors(
:A << mutlivariate(Mmean[1], MSD[1])),
:B << mutlivariate(Mmean[2], MSD[2])),
:C << mutlivariate(Mmean[3], MSD[3])), //etc. for the N columns in the made up table.
),
X Correlations(
1,
Eval(ColList),
Eval(corr_mat)
),
NRuns(1e6)
);");
Eval(Parse(new));根據原始數據表,使用用於生成相關矩陣(corr_mat)的列數(N)進行第二次模擬。 該模擬表是對各列求和以構成:Pred列的表,該列用作要發送到Profiler的偽函數。 變量Mmean和MSD是包含N列A的平均值和標準偏差的向量。
無需顯式地編寫每列及其對應的均值,我想使它更加自動化,以便它可以處理任意數量的列。
什麼是解決這個問題的好方法?
Eval(corr_mat)在X Correlations條目中實際輸入相關矩陣的值時,我也遇到了麻煩。
隨附的數據表和腳本應有助於了解我的嘗試。
謝謝!,
DS
更新,抱歉添加了錯誤的文件,現在具有正確的數據表。
回复:生成動態公式列所需的JSL代碼,該公式匯總列表中的列這是一種方法。 首先迭代構建Factors(),然後在第二步中製作完整的Simulator()表達式,其中包括X Correlations()的評估參數。
// Iteratively build the Factors expression
fs = Expr( Factors() );
For( i = 1, i <= N Items( ColList ), i++,
Insert Into(
fs,
Eval Expr( Expr( collist[i] ) << multivariate( Expr( MMean[i] ), Expr( MSD[i] ) ) )
)
);
// Make the complete Simulator expression
sim = Eval Expr(
sim_design << Simulator(
1,
Expr( Name Expr( fs ) ),
X Correlations( 1, Expr( ColList ), Expr( corr_mat ) ),
N Runs( 1e4 )
)
);
// Name Expr( sim ) // Run this line to show the expression in the log
// Launch Profiler and run the Simulator expression
sim_design = Profiler( Y( :Pred ) );
sim;
但是,X相關矩陣似乎(在大多數情況下)被忽略了。 報告中只有零。
同樣,當在探查器中手動輸入相關性並保存並運行腳本時,相關性也會丟失。 即使它們保存在已保存的腳本中。 不知道為什麼。
回复:生成動態公式列所需的JSL代碼,該公式匯總列表中的列你好@小姐,
非常感謝您的解決方案。 對於正在使用的數據表來說,它工作得很好。 我確實需要做一些修改,以考慮到我使用的許多數據表都具有其他數據類型這一事實,因此我只需要考慮數字連續數據。 無論如何,它可以正常工作,並且可以正確填寫多元方法,std devs和X Correlations。 如果這很重要,我正在使用JMP 16 EA。
謝謝你的幫助! 我還在原始請求的另一個線程中發布了有關相關矩陣的信息,以便人們希望可以從代碼中受益,並將其擴展到N個維度。
謝謝!,
DS