提取預測公式,無需將公式儲存到資料表<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我正在編寫一個腳本來將一組廣義線性模型擬合到數據,然後提取 AIC 等來進行模型平均。 由於 JMP 在廣義線性模型的設計矩陣中對分類變數進行編碼的方式(JMP 使用歸零編碼而不是角點編碼),因此很難使用報告中報告的估計係數對預測進行平均建模。適合(其中一個類別從未顯示,我需要進行大量編程才能重新建立它)。 看起來最簡單的方法是簡單地使用平台中的預測公式,然後將模型權重應用於一個大公式中的這些預測。
但是,據我所知,我需要將預測公式保存到每個模型的資料表中,然後我可以提取公式並保存以供其他地方使用,使用類似
模型擬合<<預測公式;
模型預測公式=字元(柱子(數據, “P(PA) 公式” ) <<取得公式()) ;
其中「P(PA) Formula」是預測公式。 然後,我可以將模型預測公式(以字元形式)保存在我的摘要 AIC 表中,並最終創建一個超級公式,它是各個公式的加權和...
但是,這會大大減慢腳本速度,因為預測是針對整個資料表計算的,我必須為每個模型擬合添加和刪除列。
那麼,有沒有一種方法可以從模型擬合中提取實際的預測公式,而不必先將列保存到資料表中並讓 JMP 實際進行計算?
謝謝
卡爾·施瓦茨
回覆:提取預測公式而無需將公式儲存到資料表從 JMP Pro 13.0 開始,有一種更簡單的方法“從模型擬合中提取實際的預測公式,而不必先將列保存到數據表中,然後讓 JMP 實際執行計算?」。 這正是「發布預測公式」及其變體的作用;模型擬合產生的公式直接儲存在名為的新 JMP 平台中配方倉庫。 從那裡,您可以將其應用到其他(相容)表,產生用於部署的評分程式碼(採用多種程式語言),並啟動 JMP 平台,例如分析器和模型比較。 最後一個有一個模型平均命令,我相信它實現了創建整合的最終目標。
不幸的是,尚未為您正在使用的廣義線性模型平台添加「發布」命令。 但它可用於許多其他預測建模平台 - 神經、分區、標準最小平方法等。
回覆:提取預測公式而無需將公式儲存到資料表是的,要評估 dt,它只是
dt;或者如果你想變得更奇特,eval(dt);
open 函數可以接受幾個不同的參數。 在許多情況下,參數的順序並不重要,但在本例中卻很重要。 inset into 添加到函數中參數列表的末尾,除非您指定它應該按特定順序與我在這裡沒有使用的第三個參數一起使用。
當然,這可能看起來很奇怪,但它非常方便。
透過將 open 語句包裝在表達式中,我可以在計算之前新增或刪除參數。
insert into 本質上添加了“,invisible”,只不過它不是必須解析的字串。
insert into 添加了 invis 的內容,稍微有點扭曲,如果我只是插入 invis,那麼它會插入評估的 invis,我不希望這樣,所以我將 invis 包裝在“name expr”中。name expr(invis) 將被評估為“不可見”,並且它添加了公共作為分隔符號。因此 name eval 添加表達式的文本,但它從來都不是文本。不幸的是,我越試圖解釋這一點,聽起來就越糟。
在 JSL 中,您基本上可以從空函數的表達式開始,然後用您需要的所有元件填滿它。
回覆:提取預測公式而無需將公式儲存到資料表整潔......但我真的不明白“插入”如何知道將“invis”表達式插入到“dt”表達式中的位置。 我猜 Expr “parsea” 是創建某種樹的表達式,然後“插入”只是將“invis”參數添加為樹中的另一片葉子?
我對如何將參數傳遞給 JMP 中的函數沒有足夠的了解。 我來自 R 背景,它要么是位置的,要么是參數=值的,並且發現 JMP 在 Open() 函數中使用 Invisible 之類的東西有點奇怪,因為它不是字串)。 對於這種呼叫函數的方式有什麼好的參考嗎?
我還沒有嘗試過,但我假設您需要計算表達式“dt”以開啟實際的資料表。
回覆:提取預測公式而無需將公式儲存到資料表略有不同,且沒有解析
運作靜音= 1 ;
隱形=表達式(無形的) ; //這不是字串或列表,並且不會對其進行求值
dt =表達式(打開( “$SAMPLE_DATA/大類.jmp” ) ) ;
如果(運作靜音== 1 , 我插入到( dt ,名稱表達式(隱形) ) ) ; //使用Name Expr傳回表達式的符號而不對其求值。
回覆:提取預測公式而無需將公式儲存到資料表感謝您的建議... 我也想出了
// 下面的 runsilent 標誌對於偵錯很有用。 將其設為 0 以使所有內容都可見。 1 安靜地運行
運作靜音= 0 ;
評估(解析( "data = Open( \!"SPPI_ Data_JMP_Revised.jmp\!""||如果(運作靜音, “,\!“無形的\!”” , 」 」 ) || “);” )) ;
請注意,我必須在「,invisible」字串中包含逗號,以建立在 runsilent=0 時有效的表達,以避免呼叫中出現「空」參數。
卡爾.
回覆:提取預測公式而無需將公式儲存到資料表Invisible 是一個關鍵字,所以作為參數設定起來並不那麼容易。我通常只會使用 IF 語句:
我的分佈=功能({ dt ,坳,做隱形} , {預設本地} ,
如果(做隱形,
dt <<分配(無形的,柱子(評估(坳) ) )
,
dt <<分配(柱子(評估(坳) ) )
)
) ;
dt =打開( “$SAMPLE_DATA/Big Class.jmp” ) ;
我的分佈( dt , “高度” , 1 ) ;
如果您想將其設定為參數,您可以將命令建構成字串,然後解析並執行它:
我的分佈=功能({ dt ,坳,做隱形} , {預設本地} ,
如果(做隱形,
關鍵字= “無形的”
,
關鍵字= ””
) ;
評估(解析(評估插入物( “\[
dt << 分佈( ^關鍵字^, 列( "^col^" ) )
]\" ))) ;
) ;
dt =打開( “$SAMPLE_DATA/Big Class.jmp” ) ;
我的分佈( dt , “高度” , 1 ) ;
回覆:提取預測公式而無需將公式儲存到資料表擬合的報告從未出現在螢幕上,但我從未明確使報告不可見。 我看到有一個“隱形”選項可以啟動適合...
當我在平台啟動時指定不可見選項時,時間從 45 秒減少到 30 秒。
原始資料表是可見的(其中依序保存了預測公式),最終的匯總資料表(其中依序添加了每個模型擬合的結果)也是可見的。 我嘗試使原始數據表不可見,即使添加/刪除預測列,這也確實加快了速度(現在降至 15 秒)。
最終結果表是連續建立的,因此我可以看到連續新增的行。 並將其隱形,並將時間再次縮短至8秒!
因此,瓶頸似乎在於處理螢幕操作,而不是 CPU 時間。
現在修改後的時間(在最終加速的腳本上)是
56% 模型擬合
13% 產生模型報告
12% 關閉模型報告(即使它是看不見的?)
當查看我的日誌時,我的行
模型擬合<<預測公式;
觸發了缺少布林運算符的警告訊息。 如果我把它切換到
模型擬合<<預測公式(1) ;
該腳本仍然運行良好,沒有警告訊息。 但是,我似乎在 JSL 語法參考或腳本指南中找不到任何關於什麼是
模型擬合<<預測公式(0) ;
會做? 我將嘗試編寫一個小腳本,看看後者是否也不會評估預測公式。
我現在正在嘗試修改腳本,以便可以動態設定“不可見”選項。 我想做類似的事情
運行沉默=1;
data << open("blah", if(安靜運作, "Invisible"));
但 JMP 總是在那一點停止... 當需要“硬連線”代碼字時,我總是遇到如何使訊息動態化的問題。 回到書本......
卡爾.
回覆:提取預測公式而無需將公式儲存到資料表關於時間安排,您是否嘗試過使報告視窗「不可見」。 只是好奇這是否會影響您上面 23% 的數字。
回覆:提取預測公式而無需將公式儲存到資料表謝謝伊恩和戴夫。 我在 ShowProperties 樹中的任何位置都找不到預測公式,因此我猜想在保存列操作請求之前不會計算它。
我在抑制公式求值和不抑制公式求值的情況下嘗試了我的腳本。 在不壓制公式的情況下,花了45秒。 壓制公式花了 44 秒。 我想我錯誤地假設與實際模型擬合相比,公式評估花費了大量時間,從報告中提取資訊並將資訊保存到新的(摘要)資料表中。
我沒有想到要嘗試分析腳本。 我剛剛做了這個。 這是結果
11% 的時間花在擬合模型上
13% 的時間花在建立報告上
47% 的時間花在刪除用於每個模型進行預測的列上,使用:資料 << 刪除列("P(PA) 公式");
在我使用以下命令從中提取資訊後,有 23% 的時間花在關閉報告視窗上: modelreport << 關閉視窗;
我發現這很令人驚訝!
卡爾
回覆:提取預測公式而無需將公式儲存到資料表FWIW,我認為戴夫可能是對的。 有“<<獲取估計值”和“<<獲取方差分量”訊息,但它們並不總是可用(取決於擬合的性質)。 在您的具體情況下可能值得使用“ShowProperties()”來查看。
回覆:提取預測公式而無需將公式儲存到資料表我不確定是否有辦法做你想做的事。我採取的方法是在保存預測公式之前抑制公式計算:
dt << 抑制公式 Eval(1)