変数による線形回帰のパラメータ推定値を保存3番目の列でグループ化された2つの列の線形回帰を実行しようとしていますが、行き詰まっています。 その行の傾きを持つ列と、その行の切片を持つ別の列が必要です。
簡単な背景:
私には 30,000 種類の異なる配合物があり、それぞれ 13 の異なるレベルの酸でテストされています。 酸濃度の関数としての pH の傾きを理解したいと考えています。 私の範囲 (および目的) では、これを線形回帰として実行できます。
私のデータテーブルはこのように設定されていますが、30,000 のフォーミュラコンボと 13 の酸レベルで合計 390,000 行になります。
| 式 |
酸レベル |
pH |
|---|
コンボA
|
5 |
6.7 |
| コンボB |
5 |
6.75 |
| コンボC |
5 |
6.5 |
| コンボA |
10 |
6.4 |
| コンボB |
10 |
6.45 |
Y を X で当てはめてプロットし、データをグループ化し、線形近似を追加できることはわかっていますが、1) 30,000 グループでは永遠に時間がかかり、2) レポートから傾きを引き出すのが面倒です。
現在、テーブルを「酸レベル」で分割し、「pH」を分割し、「式」を維持しています。 このようなものがあることは知っており、右側の 2 列を埋める方法が必要です。
| 式 |
PH5 |
PH10 |
PH15 |
ph20 |
スロープ |
インターセプト |
|---|
| コンボA |
データ |
データ |
データ |
データ |
|
|
| コンボB |
データ |
データ |
データ |
データ |
|
|
| コンボC |
データ |
データ |
データ |
データ |
|
|
第一の優先事項は、数式を使用することです。 スクリプトを作成する必要がある場合は、それも行うことができます。
ありがとう
Re: 列によるデータセットの線形回帰<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />式を計算する次の方法を見つけました。
SS_TOT = Summation( i = 1, N Row( dt1 ), (Column( dt1, k ) - 平均) ^ 2 / N 行( dt1 ) );
ただし、計算はすべての列「k」に対して行われます。
グループ分けを含める方法についてヒントはありますか?
SS_TOT[gp#1] / SS_TOT[gp#2] ...
Re: 列によるデータセットの線形回帰この話題に戻ります。
すべての操作を理解しており、自分のデータに適用できますが、次の部分についてはまだよくわかりません。
ベータ = J(ng, 2, .);
for (g=1、g <= ng、g++、
thisGroup = Loc(グループID == g);
beta[g, 0] = Transpose(Inv(xVals[thisGroup, 0]`*xVals[thisGroup, 0])*xVals[thisGroup, 0]`*yVals[thisGroup]);
);
ベータ行列が作成され、すべてのデータが新しいテーブルに置き換えられることを除いて、何が起こっているのか理解できません...
この点を理解するのを手伝ってもらえますか?
Re: 列によるデータセットの線形回帰あなたの最後のコメントを考慮して確認します。 ありがとうイアン
Re: 列によるデータセットの線形回帰(上記のように) 各グループに適合した係数を取得すると、予測値、つまり (各グループの) 残差と残差二乗和を取得できます。 (各グループの) 平方和の合計も簡単なので、次の値を得るために必要なものはすべて揃っています。 R2乗(グループごとに)。
ただし、JSL に操作を追加すると、時間がかかることに注意してください (ただし、この場合はプラットフォームを使用するよりも時間がかかります)。 もちろん、誰かがコードを書いて検証する必要もあります。
Re: 列によるデータセットの線形回帰イアン
マトリックスを使った素晴らしいアプローチです、ありがとう。
Rsquareも入手する方法はありますか?
Re: 列によるデータセットの線形回帰偶然にも、線形回帰が必要であることがわかっていてパラメーターだけが必要な場合は、JSL の方がはるかに高速であることを指摘しようとしていました。 以下のコードは、私のラップトップでは約 100 秒かかりました。
名前デフォルトここへ( 1 ) ;
// グループ化されたデータを作成します
GS = 10 ; // グループサイズ
NG = 30000 ; // グループの数
グループID =ソート昇順(繰り返す(( 1 :: NG ) `、 GS )) ;
xVals = J ( Nロウ(グループID ) 、 1 、ランダム通常()) ;
yVals = J ( Nロウ(グループID ) 、 1 、ランダム通常()) ;
// データをテーブルに入れます
dt1 =新しいテーブル( 「グループ回帰データ」 、
新しい列( "グループ" 、数値、公称、価値観(グループID )) 、
新しい列( "バツ" 、数値、継続的、価値観( xVals )) 、
新しい列( 「はい」 、数値、継続的、価値観( yVals )) 、
) ;
// Fit Y By X を使用してフィッティングを行うには、このブロックのコメントを解除します
/*
// Y を X に合わせて使用
fxy = dt1 << Bivariate(Y( :y ), X( x ), Fit Line( {Line Color( {208, 64, 86} )} ), By(:Group));
// pfit されたパラメータをテーブルに取得します
// (これを対話的に行うには、レポート内の任意のパラメーター推定テーブルを右クリックし、[結合データ テーブルの作成] を選択します)
fxyRep = fxy << レポート;
dt2 = fxyRep[1][TableBox(3)] << makeCombinedDataTable;
// dt2 を分割します
dt3 = dt2 << Split(Split By( :Term ), Split( :Estimate ), Group( :Group ), 残りの列( Drop All ));
dt3 << setName("Fit Y By X からのパラメータ推定値");
閉じる(dt2, noSave);
*/
/// プラットフォームをバイパスして、JSL で線形回帰を実行します。 。 。
// (1) テーブルからデータを取得します
xVals =カラム( dt1 、 "バツ" ) << getAsMatrix ;
yVals =カラム( dt1 、 「はい」 ) << getAsMatrix ;
グループID =カラム( dt1 、 "グループ" ) << getAsMatrix ;
// (2) 単位ベクトルを計画行列に追加する
xVals = J ( Nロウ( xVals ) 、 1 、 1 ) || xVals ;
// (3) 各グループに対して線形回帰を実行し、結果を保存します
ベータ= J ( NG 、 2 、 。 ) ;
のために( g = 1 、 g <= NG 、 g ++、
このグループ=ロック(グループID == g ) ;
ベータ[ g 、 0 】 =転置(投資家( xVals [このグループ、 0 ] `* xVals [このグループ、 0 ]) * xVals [このグループ、 0 ] `* yVals [このグループ]) ;
) ;
// (4) 結果の表を作成する
dt4 =テーブルとして(ベータ) ;
dt4 <<セット名( 「JSLからのパラメータ推定」 ) ;
カラム( dt4 、 「コル1」 ) <<セット名( 「インターセプト」 ) ;
カラム( dt4 、 「コル2」 ) <<セット名( "バツ" ) ;
Re: 列によるデータセットの線形回帰ピーターの脚本はきっと役に立つでしょう。ただし、参考までに、これを JSL ではなく JMP で実行する場合 (1 回限りの分析かどうかに応じて、時間の点で非常に時間がかかります)、y 行 x 列を当てはめれば、次のようになります。フィットラインをブロードキャストし、必要に応じてコーヒーを飲みに行き、JMP の実行が完了したら、パラメーター推定テーブルの 1 つを右クリックし、[結合データテーブルの作成] を選択して推定を含むテーブルを取得します。これは、スクリプトを使用せずに Peter のスクリプトを実行する方法です。
Re: 列によるデータセットの線形回帰関連するコードのほとんどを Ian Cox の投稿から取得しましたここ。これにより分析が行われ、すべての傾きと切片がテーブルに入れられます。
dt =新しいテーブル( "サンプルデータ" 、行の追加( 6 ) 、
新しい列( "式" 、キャラクター、公称、
設定値( { 「コンボA」 、 「コンボC」 、 「コンボB」 、 「コンボC」 、 「コンボA」 、 「コンボB」 } )
) 、
新しい列( 「酸レベル」 、数値、継続的、フォーマット( "最高" 、 12 ) 、
設定値( [ 5 、 15 、 5 、 5 、 10 、 10 】 )
) 、
新しい列( 「pH」 、数値、継続的、フォーマット( "最高" 、 12 ) 、
設定値( [ 6.7 、 4.8 、 6.75 、 6.5 、 6.4 、 6.45 】 )
)
) ;
// Y by X でフィットを実行
ところで= dt <<二変量(
Y ( : pH ) 、
バツ( :酸レベル) 、
フィットライン( {線の色( { 213 、 72 、 87 } )} ) 、
による( :式)
) ;
// レポート層への参照: bivREp もリストです
ビヴレップ=ところで<<報告;
// 「結合データ テーブルの作成」により、「bivRep」の各項目にメッセージを送信する必要がなくなります
dt2 =ビヴレップ[ 1 】 [テーブルボックス( 3 )] <<結合データテーブルの作成;
Re: 列によるデータセットの線形回帰JSL を実行すると、大規模なデータセットや多数の #groupID がある場合に非常に便利です。数値以外の groupID を反復処理する方法はありますか。
もちろん、数値以外の GroupID を格納する列も必要です。