創建公式以生成設計矩陣的列<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我是 JMP 的初學者,在 JMP 社區中找不到與我的問題類似的答案。 假設我有一個包含多個列的數據表,用戶需要從數據表中選擇列,然後根據選擇的列生成一個設計矩陣。 所選列和設計矩陣將在新數據表中創建。 但這還不夠。 如果用戶想要更改新數據表中所選列中的值,則設計矩陣將相應更新。 我的問題是我無法使用以下代碼正確更新設計矩陣:
// 創建一個窗口來選擇列
// 省略一些代碼來創建窗口
CheckAndConvert = Expr(
selectedColumns = c << 獲取項目;
// 如果輸入有效,我們繼續
如果(N 項(選定列)> 0,
贏 << 關閉窗口;
A = Column(selectedColumns);
s = A << 獲取矩陣; // 提取 s 中的選擇列
// 創建新的數據表“設計矩陣”
dt = New Table("設計矩陣");
dt << New Column("slice", Numeric, Values(s[0, 1])); // 將s複製到新數據表的“slice”列
// 創建設計矩陣的相應列並將它們添加到新數據表中
For( i=1, i<=Col Max(dt:slice), i++,
dt << 新列(“X”||Char(i),數字,
最後之後,
公式(
如果(dt:切片==我,1,
0
)
)
);
);
);
);
PS:在不改變slice列的值的情況下運行代碼可以得到正確的答案,但是如果我改變slice的值就無法更新X列。 注意X列的個數是slice列中的最大值,不同值不固定。 在下面的圖片中,我展示了在測試數據中選擇第 1 列和第 2 列的示例。
提前致謝,
蒲龍
回复:創建公式以生成設計矩陣的列我很抱歉。 我再次閱讀了您的請求,意識到在這種情況下 JSL 函數都無濟於事。 它們旨在為線性回歸的分類因素的影響創建列。
這是一個腳本,它將採用具有因子水平的矩陣,並為二次多項式中的每個項創建一個列的矩陣:
Names Default to Here( 1 );
x2fx = Function( { x }, { n factors, n treat, fx, f, f1, f2 },
n factors = N Col( x );
n treat = N Row( x );
fx = J( n treat, 1, 1 );
For( f = 1, f <= n factors, f++,
fx ||= x[0,f];
);
For( f1 = 1, f1 < n factors, f1++,
For( f2 = f1+1, f2 <= n factors, f2++,
fx ||= x[0,f1] :*</img> x[0,f2];
);
);
For( f = 1, f <= n factors, f++,
fx ||= x[0,f]^2;
);
fx;
);
X = [1 10,
2 20,
3 10,
4 20,
5 15,
6 15];
D = x2fx( X );
Show( D );
製作自己的功能並不難。
回复:創建公式以生成設計矩陣的列請參閱幫助 > 腳本索引。 更改瀏覽器以顯示功能。 然後選擇 Matrix 函數組。 你會在這裡找到幾個函數來從設計矩陣(因子水平)製作模型矩陣(對於術語)。
回复:創建公式以生成設計矩陣的列
我想我有一個類似的 - 如果不是相同的 - 問題。
我想從類似於 Matlab 中的 x2fx 的預測變量創建設計矩陣。
例如:通過選擇預測變量並指定設計類型(二階交互作用),然後生成設計表。
請參閱下面來自 Matlab 的示例:(但我想在 JMP 中執行此操作)。
示例 1
以下轉換 2 個預測變量<FONT face="Courier New" size="3">X1</FONT>和<FONT face="Courier New" size="3">X2</FONT> (列的<FONT face="Courier New" size="3">X</FONT> ) 到帶有項的完全二次模型的設計矩陣<FONT face="Courier New" size="3">持續的</FONT>,<FONT face="Courier New" size="3"> X1</FONT> ,<FONT face="Courier New" size="3"> X2</FONT> ,<FONT face="Courier New" size="3"> X1.*X2</FONT> ,<FONT face="Courier New" size="3"> X1.^2</FONT> , 和<FONT face="Courier New" size="3">X2.^2</FONT> .
X = [1 10
2 20
3 10
4 20
5 15
6 15];
D = x2fx(X,'quadratic')
D =
1 1 10 10 1 100
1 2 20 40 4 400
1 3 10 30 9 100
1 4 20 80 16 400
1 5 15 75 25 225
1 6 15 90 36 225 回复:創建公式以生成設計矩陣的列非常感謝你的幫助。
我今天已經找到了解決問題的方法。
回复:創建公式以生成設計矩陣的列好的,非常感謝。
所以聽起來缺少的部分是能夠在報告窗口中編輯(數字)列的單元格,在這種情況下,您可以使用“NumberColEditBox()”。 對於字符列,您可以使用“StringColEditBox”。 通過結合這兩者,您可以在您的代碼控制的編輯器窗口中顯示任何表格(儘管我猜您需要跳過行狀態和表達式列):
名稱默認到這裡( 1個) ;
// 使用數字列
dt =打開( “$SAMPLE_DATA/大類.JMP” ) ;
名稱= “高度” ;
驗證值=柱子( dt ,名稱) <<獲取值;
// 界面
淨重=新窗戶( “編輯單元格” ,行政長官=編號列編輯框(名稱,驗證值) ,按鈕盒( “更新” ,更新細胞)) ;
// 更新腳本
更新細胞=
表達式(
淨重<<關閉窗口;
新值=行政長官<<獲取矩陣;
dt <<開始數據更新;
柱子( dt ,名稱) <<設定值(新值) ;
dt <<結束數據更新;
) ;
回复:創建公式以生成設計矩陣的列謝謝你的回复。 您對工作流程的理解正是我正在做的。
關於“定義切片”:
我已經設計了窗口來完成這個任務。
關於“更新切片”:
困難在於自動更新用戶所做的任何更改。 我可以生成設計矩陣,但我不知道如果用戶在切片列中進行了一些更改,如何自動更新設計矩陣。 此外,如果我知道如何自動更新設計矩陣,通過稍微調整代碼來自動生成基於設計矩陣的其他列將不是問題。
謝謝,
蒲龍
回复:創建公式以生成設計矩陣的列非常感謝您提供更詳細的解釋。 也許我可以用不同的詞回應它以確保我已經理解?
假設第一個表(包含所有可能的切片)稱為 dt0。 想想你上面的關鍵步驟:
- 用戶在 dt0 中選擇一個列(一個切片),並製作一個新表(稱為 dt1),其中僅包含該切片,加上設計矩陣的列(加上您提到的其他派生列,但不要拼寫) .
- 您希望用戶稍後能夠修改 dt1 中的切片列並讓 dt1 中的其他列“自動”更新。
我想您最終的加載項將有兩個菜單選項:“定義切片”和“更新切片”。 如果我對上面 1. 的描述是正確的,那麼通過調整我已經建議的代碼可以很容易地獲得這個“設計切片”腳本:表 dt1 可以放在一個共享文件夾中,這樣其他人就可以得到它,你可以添加任何內容您想要的元數據到表或其中的列。
“更新切片”腳本可以向用戶顯示共享文件夾中的所有可用表,並允許他們選擇一個。 不過此時,他們不會直接編輯表格:相反,他們會看到一個報告窗口,允許他們修改表格中切片列的值。 在這裡,“修改”可能意味著更新現有值或添加新行。 當他們在此報告中單擊 OK 表示他們很高興時,dt1 可以自動更新以反映他們的所有更改,您還可以根據需要更新元數據。 當然,這個“更新”代碼與“定義切片”是通用的。
除非我誤解了,否則這個工作流程似乎是合理的,甚至可能比讓用戶免費訪問 dt1 本身更好。
回复:創建公式以生成設計矩陣的列由於這是第一次使用 JMP,我將嘗試用 JMP 腳本語言來描述我的問題。 簡而言之,我有一個數據表,其中有一個“切片”列,我想根據切片列生成設計矩陣,並根據設計矩陣生成其他一些列。 我需要做的是開發一個實現這個任務的 JMP 插件,以便其他同事也可以使用我的插件進行計算機實驗。
首先,我想開發一個選擇切片列的窗口,並生成一個包含切片列和設計矩陣的數據表,並保存公式如果稍後更改切片列中的某些值,則自動更新設計矩陣. (我需要保存公式,因為我的項目經理要求它,但如果我想出更好的解決方案,我可以在不使用公式列的情況下說服他。)
現在,我可以創建窗口,並生成包含切片列和設計矩陣的數據表,但是如果我更改切片列中的值,設計矩陣將無法更新。
關於切片列:
我知道 JMP 中的設計功能可以自動生成設計矩陣,但如果我想要公式列,它就沒有幫助。 所以我編寫了自己的函數來生成我的設計矩陣,如我的腳本所示。 假設我有切片列 a = [1, 1, 2, 3]'。 然後設計矩陣將生成為
1 0 0
1 0 0
0 1 0
0 0 1。
切片列可能變化很大,因此很難通過手動查看切片列來了解設計矩陣有多少列。 此外,切片列中的值可以任意修改。
我認為創建生成設計矩陣的關鍵步驟如下:
1.選中切片列,點擊“確定”按鈕,會生成一個新的表格,其中包括切片列和設計矩陣。 顯然,此步驟涉及人工干預。
2、如果我手動修改新表中slice列的一些值,那麼原來的設計矩陣會自動刪除,並生成對應的新設計矩陣。
其次,我還需要根據設計矩陣生成一些列,我也寫了生成它們的腳本,但我不知道如何將它們保存為公式列。 如果我知道如何保存設計矩陣的公式列,這個問題就不是問題了。
最後,如果我成功創建了設計矩陣和一些列,那麼我會將它們打包為一個插件,並在許多不同的情況下進行測試。
謝謝你的建議。 如果我讓自己明白了,請告訴我。
蒲龍
回复:創建公式以生成設計矩陣的列我當然可能是錯的(取決於您需要解決方案的通用性),但我覺得公式列不是嘗試此操作的最佳方式。 源表中的一列(通常)映射到多列這一事實,以及此類列的數量是源列中級別的(可變)數量這一事實使這變得困難。
在提供另一個建議之前,也許您可以更詳細地描述您設想的工作流程,好嗎? 還指出哪些步驟涉及人工干預。
回复:創建公式以生成設計矩陣的列感謝您的幫助。
我需要從一列生成設計矩陣,這樣我也可以在列中的值發生變化時更新設計矩陣。 事實上,我想創建一個公式來根據選定的列生成設計矩陣,並保存該公式,以便在修改選定列中的某些值時更新設計矩陣。
在我的代碼中,生成了設計矩陣,但如果我更改所選列中的某些值,我將無法獲得更新的設計矩陣,這是我一直在努力解決的問題。 如果您能就我的問題提供一些建議,我將不勝感激。
謝謝,
蒲龍
回复:創建公式以生成設計矩陣的列我不太確定你在找什麼。 但鑑於您是 JMP 的新手,下面的代碼可能會給您一些想法。
名稱默認到這裡( 1個) ;
// 測試表
dt =新表( “測試” ,
新專欄( “C1” ,數字,連續的,公式(隨機整數( 1個, 5個))) ,
新專欄( “C2” ,數字,連續的,公式(隨機整數( 1個, 5個))) ,
新專欄( “C3” ,數字,連續的,公式(隨機整數( 1個, 5個))) ,
添加行( 10 )
) ;
// 界面
新窗戶( “更新設計” ,
面板盒( “選擇一列看設計” ,
潤滑劑=排隊箱( NCol ( 2個) ,
clb =列錶框( dt ,全部,數字,最大項目( 1個) ,最小項目( 1個) ,腳本) )
)
) ;
// 根據 clb 中的選擇動態更新 line up box lb 的腳本
腳本=
表達式(
// 獲取選中列中的值
值=柱子( dt , clb <<得到選擇) <<獲取矩陣;
// 刪除任何現有的矩陣框
嘗試(姆<<刪除) ;
// 獲取矩陣框中的設計矩陣
姆=矩陣盒(設計(值)) ;
// 追加新的矩陣框
潤滑劑<<附加(姆) ;
) ;