在早先的帖子 ,我提到一個新的JMP加載項可用於在之前分割數據預測建模 。這篇文章討論了它的工作原理,因此必然涉及JMP腳本語言(JMP Scripting Language,簡稱JSL)的主題。
這是一個很大的主題,所以在這裡我只想展示一個有用的JSL腳本的解剖。本文假設您已下載並安裝加載項並熟悉它的作用。(注意:下載加載項需要免費的SAS登錄。)
如果在JMP 9中選擇菜單項“查看>加載項...”,則應在組合框中看到“分層拆分”。選擇此項為您提供了加載項“主文件夾”的鏈接,選擇此鏈接並雙擊“stratifiedSplit.jsl”將打開JMP編輯器中的源代碼。要繼續,請確保您已選擇在編輯器中顯示行號('文件>首選項',然後選擇'腳本編輯器'作為'首選項組')。
JSL可以解構如下:
(1) 第11-13行: 要拆分數據的默認比例。請注意,名稱中的後綴“0”,“1”或“2”表示與“培訓”,“驗證”或“測試”數據有關(鏡像JMP所生成的隨機指示符列中生成的值) 。
(2) 第15-29行: 如果更新其中一個默認比例而調用的函數,它會檢查您的新值確實介於0和1之間。
(3) 第31-55行: 用戶界面 - 顯示當前數據表中的所有列,並允許您選擇響應列。您還可以覆蓋默認的拆分比例。

(4) 第58-85行: 如果按下(3)中的“幫助”按鈕,則在新窗口中顯示幫助。
(5) 第88-104行: 按下(3)中的“確定”按鈕時運行並檢查實際指定的三個比例是否仍為總和。如果不是,則使用默認的分割比例再次顯示(3)。
(6) 第107-135行: 檢查實際選擇了響應列,如果沒有則停止。如果選擇了響應列,則查找該列中不同級別的數量,如果大於100,則提供停止選項。
(7) 138-182行: 使用當前表的哪些行對應於響應列(6)的哪個級別和指定的拆分比例(3)的映射,構建新的驗證列。然後使用Distribution來顯示表中的行是如何隨機分割的。
對於那些已經熟悉JSL的人來說,這裡的代碼並不起眼。但是,在更高的層次上,總是需要做出設計決策,並且當人們記住最終結果必須對其預期用途“足夠好”時,通常需要妥協。
在這種情況下,例如,特別選擇將錯誤檢查分成兩部分 - 上面的(2)和(5) - 以簡化用戶界面背後的邏輯。即使您是JSL的新手,只需要一點耐心並在JSL指南(“幫助>書籍>腳本指南”)的幫助下,您就應該能夠弄清楚每個代碼部分實際工作的細節。畢竟,開始學習一門新語言的最好方法之一就是從有效的東西開始。出於空間原因,我們只看這裡(6)和(7)。
如前所述,此問題的關鍵部分之一是找出響應列中的級別(6)。雖然有很多方法可以做到這一點,但是關聯數組是最多才多藝的。
下面顯示的代碼片段使表格可以使用。第5行將'Response'的20個值獲取到一個向量中,第6行構建一個關聯數組並向其發送一個'Get Keys'消息,以顯示詞典排序中的不同值。關聯數組的一個優點是它適用於任何數據類型(不僅僅是數字,如本例所示),但請注意'Get Keys'總是返回一個列表。因此,在第7行中,我們需要使用'N Items()'來查找此列表包含的項目數。

一旦我們從(6)得到'yLev'和'nLevs'的值,(7)中的步驟如下:
1。構建缺失值的向量,'vVals',稍後將用於填充新的驗證列(第141行)。
2。循環在'yLev'中保持的不同級別(第143到161行)。
3。找到與當前級別對應的'yVals'(以及數據表)中的行號,並將它們存儲在變量'stratum'中(第145行)。請注意,執行此操作的語法取決於“yVals”是矢量還是列表(因此,原始響應列的數據類型是“數字”還是“字符”)。
4。變量'stratumN'保存與當前級別對應的行數(第147行)。將指定的拆分比例轉換為整數,並確保這些總和為'stratumN'(第149至154行)。
5。構建正確長度的向量'v0','v1'和'v2',並分別包含值'0','1'和'2'(第157到159行)。請注意,為了確保後續步驟始終有效,我們必須考慮其中一個比例為0.0並將相應的向量設置為“[]”的可能性。
6。將這些向量堆疊在一起(使用'VConCat()'),並對結果進行混洗,以便隨機分配'0','1'和'2'值。將這些值分配給'vVals'中的正確行,以便替換其中的缺失值(第160行)。
7。循環完成後,使用'vVals'構建新的驗證列或替換現有的驗證列(第163到170行)。請注意,我們使用“值標籤”列屬性,以便“0”,“1”和“2”的整數值分別顯示為“培訓”,“驗證”和“測試”。
8。使用帶有'By'變量的'Distribution'來顯示響應中每個級別的驗證列的值。
雖然常規,但代碼可能有一些非顯而易見的方面:
•我們沒有對您選擇的響應列的數據類型或建模類型做出任何不必要的假設(代碼可以很好地工作,例如,使用'數字','連續'列,其值恰好為'聚集成“水平”。
•響應列中缺少的值作為缺失值傳播到構建的驗證列,這是可取的。但請注意,在數字列的情況下,'。'當分發平台嘗試使用'。'處理'By'組時,value將導致良性JMP警報。值。對於Character列,空字符串“”的處理方式與“By”組中的其他級別一樣,沒有警報。
•第42行中的'ColListBox()'表達式不提供行狀態列以供選擇,即使它們存在於表中,這在這種情況下是可取的。
如果您使用JMP並喜歡修補代碼,那麼有很多方法可以了解更多信息。你可以從這看起來開始文件交換條目 。