使用 by Variable 保存線性回歸的參數估計值我正在嘗試對按第三列分組的兩列進行線性回歸,但遇到了困難。 我想要一列具有該行的斜率,另一列具有該行的截距。
簡短的背景:
我有 30k 種不同的配方,每種配方都經過 13 種不同水平的酸測試。 我想了解 pH 值的斜率與酸濃度的函數關係。 對於我的範圍(和目的),我可以將其作為線性回歸來完成。
我的數據表是這樣設置的,但有 30k 公式組合和 13 個酸水平,總共 390k 行。
| 公式 |
酸度 |
酸鹼度 |
|---|
組合A
|
5 |
6.7 |
| 組合B |
5 |
6.75 |
| 組合C |
5 |
6.5 |
| 組合A |
10 |
6.4 |
| 組合B |
10 |
6.45 |
我知道我可以用 Fit Y by X 繪製它們,對數據進行分組,然後添加線性擬合,但是 1) 需要 30k 組永遠花費時間,2) 從該報告中提取斜率是很痛苦的
我目前已按“酸度”拆分錶格,拆分“pH”,並保留“配方”。 我知道有類似的東西,並且想要一種方法來填寫右邊的兩列。
| 公式 |
酸鹼度5 |
酸鹼度10 |
酸度15 |
酸鹼度20 |
坡 |
截距 |
|---|
| 組合A |
數據 |
數據 |
數據 |
數據 |
|
|
| 組合B |
數據 |
數據 |
數據 |
數據 |
|
|
| 組合C |
數據 |
數據 |
數據 |
數據 |
|
|
第一個選擇是使用公式。 如果我需要編寫腳本,我也可以這樣做。
謝謝
回复:按列對數據集進行線性回歸<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我找到了以下計算表達式的方法。
SS_TOT = 求和( i = 1, N 行( dt1 ), (列( dt1, k ) - 一個平均值) ^ 2 / N 行( dt1 ) );
但計算是針對所有“k”列進行的。
關於如何包含一些分組分離的任何提示?
SS_TOT[gp#1] / SS_TOT[gp#2] ...
回复:按列對數據集進行線性回歸回到這個話題。
我了解所有操作並可以應用於我的數據,但仍然對以下部分非常不清楚:
β = J(ng, 2, .);
對於 (g=1, g <= ng, g++,
thisGroup = Loc(groupID == g);
beta[g, 0] = Transpose(Inv(xVals[thisGroup, 0]`*xVals[thisGroup, 0])*xVals[thisGroup, 0]`*yVals[thisGroup]);
);
除了創建 beta 矩陣並將所有數據替換到新表中之外,無法弄清楚發生了什麼......
你能幫我理解這一點嗎?
回复:按列對數據集進行線性回歸將考慮您最後的評論進行檢查。 謝謝伊恩
回复:按列對數據集進行線性回歸一旦獲得了每個組的擬合係數(如上所述),您就可以獲得預測值,從而獲得殘差和殘差平方和(對於每個組)。 平方和(對於每組)也很容易,所以你就擁有了獲得所需的一切R 平方(對於每個組)。
但請記住,當您向 JSL 添加更多操作時,需要的時間會更長(儘管在本例中仍然比使用平台更快)。 當然,還需要有人編寫和驗證代碼!
回复:按列對數據集進行線性回歸伊恩
謝謝,這是一個很好的矩陣方法。
有沒有辦法獲得 Rsquare?
回复:按列對數據集進行線性回歸巧合的是,我正要指出,如果您知道需要線性回歸併且只需要參數,那麼 JSL 會快得多。 下面的代碼在我的筆記本電腦上花費了大約 100 秒。
名稱默認到這裡( 1 ) ;
// 製作一些分組數據
GS = 10 ; // 組大小
吳= 30000 ; // 組數
組ID =升序(重複(( 1 ::吳) `, GS )) ;
值= J (行(組ID ) , 1 ,隨機正態()) ;
y值= J (行(組ID ) , 1 ,隨機正態()) ;
// 將數據放入表中
dt1 =新表( “分組回歸數據” ,
新專欄( “團體” ,數字,標稱,價值觀(組ID )) ,
新專欄( “X” ,數字,連續的,價值觀(值)) ,
新專欄( “是” ,數字,連續的,價值觀( y值)) ,
) ;
// 取消註釋此塊以使用 Fit Y By X 進行擬合
/*
// 使用 Y 按 X 擬合
fxy = dt1 << 雙變量(Y( :y ), X( x ), 擬合線( {線條顏色( {208, 64, 86} )} ), By(:Group));
// 將擬合後的參數放入表中
//(要以交互方式執行此操作,請右鍵單擊報告中的任何參數估計表並選擇“創建組合數據表”)
fxyRep = fxy << 報告;
dt2 = fxyRep[1][TableBox(3)] << makeCombinedDataTable;
// 分割 dt2
dt3 = dt2 << 拆分(拆分依據( :Term ), Split( :Estimate ), Group( :Group ), 剩餘列( Drop All ));
dt3 << setName("通過 X 擬合 Y 的參數估計值");
關閉(dt2,不保存);
*/
/// 在 JSL 中進行線性回歸,繞過平台。 。 。
// (1) 從表中獲取數據
值=柱子( dt1 , “X” ) <<獲取矩陣;
y值=柱子( dt1 , “是” ) <<獲取矩陣;
組ID =柱子( dt1 , “團體” ) <<獲取矩陣;
// (2) 將單位向量添加到設計矩陣中
值= J (行(值) , 1 , 1 ) ||值;
// (3) 對每組進行線性回歸併存儲結果
貝塔= J (吳, 2 , 。 ) ;
為了( G = 1 , G <=吳, G ++,
本組=洛克(組ID == G ) ;
貝塔[ G , 0 ] =轉置(庫存(值[本組, 0 ] `*值[本組, 0 ]) *值[本組, 0 ] `* y值[本組]) ;
) ;
// (4) 製作結果表
dt4 =表格(貝塔) ;
dt4 <<設置名稱( “JSL 的參數估計” ) ;
柱子( dt4 , “第 1 列” ) <<設置名稱( “截距” ) ;
柱子( dt4 , “第2欄” ) <<設置名稱( “X” ) ;
回复:按列對數據集進行線性回歸彼得的劇本會對你很有幫助。但是,作為參考,如果您要通過 JMP 而不是 JSL 來執行此操作(這通常會浪費時間,具體取決於是否是一次性分析),那麼如果您適合 y-by-x,則可以“廣播”您的擬合線,如果需要,去喝杯咖啡,然後當JMP 運行完成後,右鍵單擊其中一個參數估計表並選擇“製作組合數據表”以獲取包含估計值的表。這就是如何在沒有腳本的情況下執行Peter的腳本。
回复:按列對數據集進行線性回歸從 Ian Cox 的帖子中獲取了大部分相關代碼這裡。這將進行分析,然後將所有斜率和截距放入表格中。
dt =新表( “樣本數據” ,添加行( 6 ) ,
新專欄( “公式” ,特點,標稱,
設定值( { “組合A” , “組合C” , “組合B” , “組合C” , “組合A” , “組合B” } )
) ,
新專欄( “酸度” ,數字,連續的,格式( “最好的” , 12 ) ,
設定值( [ 5 , 15 , 5 , 5 , 10 , 10 ] )
) ,
新專欄( “酸鹼度” ,數字,連續的,格式( “最好的” , 12 ) ,
設定值( [ 6.7 , 4.8 , 6.75 , 6.5 , 6.4 , 6.45 ] )
)
) ;
// 通過 X 運行擬合 Y
乙肝病毒= dt <<雙變量(
是( :酸鹼度) ,
X ( :酸度) ,
擬合線( {線條顏色( { 213 , 72 , 87 } )} ) ,
經過( :公式)
) ;
// 對報表層的引用:bivREp也是一個列表
比夫代表=乙肝病毒<<報告;
//“製作組合數據表”避免了向“bivRep”中的每個項目發送消息
dt2 =比夫代表[ 1 ] [表格框( 3 )] <<製作組合數據表;
回覆:按列對資料集進行線性迴歸對於大型資料集和大量#groupIDs 來說,運行 JSL 非常有用。有沒有辦法迭代非數位 groupID。
當然還需要一個欄位來儲存非數字的 GroupID。