Main Content

stepwisefit

ステップワイズ回帰を使用して線形回帰モデルを当てはめる

説明

b = stepwisefit(X,y) は、行列 X 内の予測子変数に対する応答ベクトル y のステップワイズ回帰の係数推定値が格納されているベクトル b を返します。stepwisefit は、初期定数モデルから開始して、停止条件が満たされるまでステップを進めたり戻したりして、変数を追加または削除します。

b = stepwisefit(X,y,Name,Value) では、1 つ以上の名前と値のペアの引数を使用して追加オプションを指定します。たとえば、非定数の初期モデル、または stepwisefit が受け入れ可能なステップの最大数を指定できます。

[b,se,pval] = stepwisefit(___) は、前の構文におけるいずれかの入力引数の組み合わせを使用して、係数推定値 b、標準誤差 se、および p 値である pval を返します。

[b,se,pval,finalmodel,stats] = stepwisefit(___) は、最終回帰モデル finalmodel 内の変数の指定、および最終モデルについての統計値 stats も返します。

[b,se,pval,finalmodel,stats,nextstep,history] = stepwisefit(___) は、次の推奨ステップ nextstep、およびそれまでのすべてのステップに関する情報 history も返します。

すべて折りたたむ

基本的なステップワイズ回帰を実行し、係数推定値を取得します。

hald データ セットを読み込みます。

load hald
whos % Check variables loaded in workspace
  Name              Size            Bytes  Class     Attributes

  Description      22x58             2552  char                
  hald             13x5               520  double              
  heat             13x1               104  double              
  ingredients      13x4               416  double              

このデータ セットには、4 つのセメント原料から成るさまざまな混合物について、セメント硬化時に発生した熱の観測値が含まれています。応答変数は heat です。行列 ingredients には、予測子の列が 4 つ含まれています。

モデル内の定数項のみで開始し、既定のエントリと終了許容誤差にそれぞれ 0.05 および 0.10 を使用して stepwisefit を実行します。

b = stepwisefit(ingredients,heat)
Initial columns included: none
Step 1, added column 4, p=0.000576232
Step 2, added column 1, p=1.10528e-06
Final columns included:  1 4 
    {'Coeff'  }    {'Std.Err.'}    {'Status'}    {'P'         }
    {[ 1.4400]}    {[  0.1384]}    {'In'    }    {[1.1053e-06]}
    {[ 0.4161]}    {[  0.1856]}    {'Out'   }    {[    0.0517]}
    {[-0.4100]}    {[  0.1992]}    {'Out'   }    {[    0.0697]}
    {[-0.6140]}    {[  0.0486]}    {'In'    }    {[1.8149e-07]}
b = 4×1

    1.4400
    0.4161
   -0.4100
   -0.6140

stepwisefit 表示には、列 1 および 4 が最終モデルに含まれることが示されます。出力 b には、最終モデルに表示されないものであっても、すべての列に関する推定値が含まれます。stepwisefit は、最終モデルと列 2 (または 3) で構成されるモデルを当てはめることにより、列 2 (または 3) の推定値を計算します。

さまざまな自動車の測定値を含む carsmall データ セットを読み込みます。

load carsmall
whos
  Name                Size            Bytes  Class     Attributes

  Acceleration      100x1               800  double              
  Cylinders         100x1               800  double              
  Displacement      100x1               800  double              
  Horsepower        100x1               800  double              
  MPG               100x1               800  double              
  Mfg               100x13             2600  char                
  Model             100x33             6600  char                
  Model_Year        100x1               800  double              
  Origin            100x7              1400  char                
  Weight            100x1               800  double              

4 つの連続変数と応答変数 MPG を使用して、ステップワイズ回帰を実行します。

X = [Acceleration Cylinders Displacement Horsepower];
y = MPG;
b4_default = stepwisefit(X,y) % Stepwise regression with default arguments
Initial columns included: none
Step 1, added column 2, p=1.59001e-25
Step 2, added column 4, p=0.00364266
Step 3, added column 1, p=0.0161414
Final columns included:  1 2 4 
    {'Coeff'  }    {'Std.Err.'}    {'Status'}    {'P'         }
    {[-0.4517]}    {[  0.1842]}    {'In'    }    {[    0.0161]}
    {[-2.6407]}    {[  0.4823]}    {'In'    }    {[4.0003e-07]}
    {[ 0.0148]}    {[  0.0157]}    {'Out'   }    {[    0.3472]}
    {[-0.0772]}    {[  0.0204]}    {'In'    }    {[2.6922e-04]}
b4_default = 4×1

   -0.4517
   -2.6407
    0.0148
   -0.0772

Displacement がモデルに入力されることはありません。項の相関行列を計算して、他の 3 つの項と高い相関関係があるかどうかを特定します。

corrcoef(X,'Rows','complete') % To exclude rows with missing values from calculation
ans = 4×4

    1.0000   -0.6438   -0.6968   -0.6968
   -0.6438    1.0000    0.9517    0.8622
   -0.6968    0.9517    1.0000    0.9134
   -0.6968    0.8622    0.9134    1.0000

相関行列の 3 行目は Displacement に対応します。この項は、他の 3 つの項、特に Cylinders (0.95) および Horsepower (0.91) と高い相関関係があります。

入力行列 XWeight を含むように再定義します。名前と値のペアの引数 'InModel' を使用して、項 Displacement および Horsepower を含む初期モデルを指定します。

X = [Acceleration Cylinders Displacement Horsepower Weight];
inmodel = [false false true true false];
b5_inmodel = stepwisefit(X,y,'InModel',inmodel)
Initial columns included: 3 4 
Step 1, added column 5, p=1.06457e-06
Step 2, added column 2, p=0.00410234
Final columns included:  2 3 4 5 
    {'Coeff'  }    {'Std.Err.'}    {'Status'}    {'P'         }
    {[-0.0912]}    {[  0.2032]}    {'Out'   }    {[    0.6548]}
    {[-2.3223]}    {[  0.7879]}    {'In'    }    {[    0.0041]}
    {[ 0.0252]}    {[  0.0145]}    {'In'    }    {[    0.0862]}
    {[-0.0449]}    {[  0.0231]}    {'In'    }    {[    0.0555]}
    {[-0.0050]}    {[  0.0012]}    {'In'    }    {[1.0851e-04]}
b5_inmodel = 5×1

   -0.0912
   -2.3223
    0.0252
   -0.0449
   -0.0050

最終モデルは、項 2–5 で構成されます。ただし、推定値 Displacement および Horsepower は、最終モデルにおいて 0.05 よりも大きい p 値をもちます。名前と値のペアの引数 'PRemove' を使用すると、より保守的に動作するようにステップワイズ アルゴリズムを調整することができます。たとえば、'PRemove' を (既定の 0.1 に代えて) 0.05 に設定することにより、それぞれが 0.05 よりも小さい p 値をもつ、項が 2 つだけのより小さい最終モデルが得られます。

b5_inmodel_premove = stepwisefit(X,y,'InModel',inmodel,'PRemove',0.05)
Initial columns included: 3 4 
Step 1, added column 5, p=1.06457e-06
Step 2, added column 2, p=0.00410234
Step 3, removed column 3, p=0.0862131
Step 4, removed column 4, p=0.239239
Final columns included:  2 5 
    {'Coeff'  }    {'Std.Err.'}    {'Status'}    {'P'         }
    {[-0.0115]}    {[  0.1656]}    {'Out'   }    {[    0.9449]}
    {[-1.6037]}    {[  0.5146]}    {'In'    }    {[    0.0025]}
    {[ 0.0101]}    {[  0.0124]}    {'Out'   }    {[    0.4186]}
    {[-0.0234]}    {[  0.0198]}    {'Out'   }    {[    0.2392]}
    {[-0.0055]}    {[  0.0011]}    {'In'    }    {[3.9038e-06]}
b5_inmodel_premove = 5×1

   -0.0115
   -1.6037
    0.0101
   -0.0234
   -0.0055

名前と値のペアの引数 'Scale' を使用して当てはめる前に、各列をセンタリングし、スケーリングします (z スコアを計算します)。このスケーリングでは、選択したモデル、係数推定値の符号、またはその p 値は変更されません。ただし、係数推定値をスケーリングします。

b5_inmodel_premove_scale = stepwisefit(X,y,'InModel',inmodel,'PRemove',0.05,'Scale','on')
Initial columns included: 3 4 
Step 1, added column 5, p=1.06457e-06
Step 2, added column 2, p=0.00410234
Step 3, removed column 3, p=0.0862131
Step 4, removed column 4, p=0.239239
Final columns included:  2 5 
    {'Coeff'  }    {'Std.Err.'}    {'Status'}    {'P'         }
    {[-0.0370]}    {[  0.5339]}    {'Out'   }    {[    0.9449]}
    {[-2.8136]}    {[  0.9028]}    {'In'    }    {[    0.0025]}
    {[ 1.1155]}    {[  1.3726]}    {'Out'   }    {[    0.4186]}
    {[-1.0617]}    {[  0.8961]}    {'Out'   }    {[    0.2392]}
    {[-4.4406]}    {[  0.9028]}    {'In'    }    {[3.9038e-06]}
b5_inmodel_premove_scale = 5×1

   -0.0370
   -2.8136
    1.1155
   -1.0617
   -4.4406

通常、スケーリングは、異なるスケール (HorsepowerWeight など) で測定された項の推定値を比較するために行います。この場合は、Horsepower の標準偏差を 1 ずつ大きくすると MPG1 低下することが期待され、Weight の標準偏差を 1 ずつ大きくすると MPG4.4 低下することが期待されます。

imports-85 データ セットを読み込みます。このデータ セットには、1985 年に取り込まれた自動車の特性が含まれています。すべての列名の一覧については、ワークスペースの変数 Description を参照するか、コマンド ラインで Description と入力してください。

load imports-85
whos 
  Name               Size            Bytes  Class     Attributes

  Description        9x79             1422  char                
  X                205x26            42640  double              

ステップワイズ回帰で使用する連続変数のサブセットを選択します。このサブセットは、予測子変数 engine-sizeborestrokecompression-ratiohorsepowerpeak-rpmcity-mpg、および highway-mpg と、応答変数 price で構成されます。

varnames = ["engine-size","bore","stroke","compression-ratio","horsepower","peak-rpm","city-mpg","highway-mpg","price"]; % Variable names to use in stepwise regression
dataTbl = array2table(X(:,8:16),'VariableNames',varnames); % Create data table with variable names
Xstepw = dataTbl{:,{'engine-size','bore','stroke','compression-ratio','horsepower','peak-rpm','city-mpg','highway-mpg'}}; % Input matrix
ystepw = dataTbl{:,{'price'}}; % Response vector

他の 8 つの変数で変数 pricestepwisefit を実行します。最初は既定の定数初期モデルを使用し、次に highway-mpg を含む初期モデルを使用します。ステップ情報の表示を省略します。

[betahat_def,se_def,pval_def,finalmodel_def,stats_def] = stepwisefit(Xstepw,ystepw,'Display',"off"); 
inmodel = [false false false false false false false true]; 
[betahat_in,se_in,pval_in,finalmodel_in,stats_in] = stepwisefit(Xstepw,ystepw,'InModel',inmodel,'Display','off');

stepwisefit によって返される最終モデルを検査します。

finalmodel_def
finalmodel_def = 1x8 logical array

   1   0   1   1   0   1   1   0

finalmodel_in
finalmodel_in = 1x8 logical array

   1   0   1   1   0   1   0   1

既定のモデルでは、モデルから highway-mpg (項 8) を削除し、代わりに city-mpg (項 7) を含めます。これら 2 つの最終モデルの平方根平均二乗誤差 (RMSE) を比較します。

stats_def.rmse
ans = 3.3033e+03
stats_in.rmse
ans = 3.3324e+03

既定の引数から得られたモデルでは RMSE がわずかに小さくなります。完全な仕様の最終モデルは、項の推定値と切片の推定値で構成されることに注意してください。

betahat_def % Term estimates
betahat_def = 8×1
103 ×

    0.1559
   -0.2242
   -2.8578
    0.3904
    0.0222
    0.0024
   -0.2414
    0.0793

stats_def.intercept % Intercept estimate
ans = -7.3506e+03

stepwisefit の既定の実行履歴と、次の推奨ステップを取得します。ステップ情報の表示を省略します。

[~,~,~,~,~,nextstep_def,history_def]=stepwisefit(Xstepw,ystepw,'Display',"off"); 
nextstep_def
nextstep_def = 0

推奨ステップはこれ以上存在しません (nextstep_def0)。

history_def.('in') 
ans = 7x8 logical array

   1   0   0   0   0   0   0   0
   1   0   0   0   1   0   0   0
   1   0   0   1   1   0   0   0
   1   0   1   1   1   0   0   0
   1   0   1   1   1   1   0   0
   1   0   1   1   1   1   1   0
   1   0   1   1   0   1   1   0

アルゴリズムは、合計で 7 つのステップを実行します。出力は、engine-size (項 1) がステップ 1 に追加されることや、horsepower (項 5) がステップ 2 に追加されることなどを示しています。

入力引数

すべて折りたたむ

予測子変数。n 行 p 列の数値行列として指定します。ここで、n は観測値の数、p は予測子変数の数です。X の各列が 1 つの変数を表し、各行が 1 つの観測値を表します。

stepwisefit は常にモデル内の定数項を含みます。そのため、1 の列を X に含めないでください。

データ型: single | double

応答変数。n 行 1 列の数値または logical ベクトルとして指定します。ここで、n は観測値の数です。y の各エントリは X の対応する行に対する応答です。

データ型: single | double | logical

メモ

stepwisefit は、X または yNaN 値を欠損値として扱い、これらの値を含むすべての行を無視します。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

例: 'PEnter',0.10,'PRemove',0.15,'MaxIter',8 では、stepwisefit に対し、エントリと終了許容誤差にそれぞれ 0.100.15 を使用して、最大 8 つのステップを実行するように指示しています。

初期モデルの項。'InModel' と、初期モデルに含める項を指定する logical ベクトルで構成されるコンマ区切りのペアとして指定します。既定の設定では、どの項も含まれていません。

例: 'InModel',[true false false true]

データ型: logical

モデルに項を追加する許容誤差。'PEnter' と、追加する項の最大 p 値を指定する正のスカラーで構成されるコンマ区切りペアとして指定します。既定値は 0.05 です。

例: 'PEnter',0.10

データ型: single | double

モデルから項を削除する許容誤差。 'PRemove' と、削除する項の最小 p 値を指定する正のスカラーで構成されるコンマ区切りペアとして指定します。既定値は PEnter の最大値と 0.10 です。

メモ

PRemovePEnter よりも小さくすることは許可されていません。その理由は、stepwisefit が無限ループに入り、変数のモデルへの追加とモデルからの削除が繰り返される可能性があるからです。

例: 'PRemove',0.15

データ型: single | double

ステップ情報の表示用インジケーター。'Display''on' または 'off' から構成されるコンマ区切りのペアとして指定します。

  • 'on' の場合、コマンド ウィンドウの各ステップに関する情報を表示します (既定)。

  • 'off' の場合、表示を省略します。

例: 'Display','off'

最大ステップ数。'MaxIter' と正の整数または Inf (既定) から構成されるコンマ区切りのペアとして指定します。Inf では、単一のステップでモデルが改善しなくなるまでアルゴリズムの実行を許可します。

例: 'MaxIter',12

データ型: double

初期状態で保持する項。'Keep' と logical ベクトルで構成されるコンマ区切りのペアとして指定します。初期モデルに含まれる (または除外される) ように指定した項の値が true の場合、その項は強制的に最終モデルに残る (または除外される) ことになります。項の値が false であれば、その項が強制的に最終モデルに残される (または除外される) ことはありません。既定の設定では、初期状態において項が保持されないように指定します。

例: 'Keep',[true true false false]

データ型: logical

項のセンタリングおよびスケーリング用インジケーター。'Scale''off' または 'on' で構成されるコンマ区切りのペアとして指定します。

  • 'off' の場合、項のセンタリングとスケーリングを行いません (既定)。

  • 'on' の場合、当てはめの前に、X の各列をセンタリングし、スケーリングします (z スコアを計算します)。

例: 'Scale','on'

出力引数

すべて折りたたむ

推定係数。X の項に対応する数値ベクトルとして返されます。関数 stepwisefitb の値を次のように計算します。

  • 最終モデルに項が含まれる場合、b の対応する値は、最終モデルの当てはめによって得られた推定値になります。

  • 最終モデルから項が除外される場合、b の対応する値は、最終モデルとその項の当てはめによって得られた推定値になります。

メモ

完全な仕様の当てはめられたモデルを取得するには、b に加えて、切片の推定値も必要です。切片の推定値は、出力引数 stats のフィールドとして与えられます。詳細は、stepwisefit の当てはめられたモデルを参照してください。

標準誤差。b 内の推定値に対応する数値ベクトルとして返されます。

p 値。b の要素が 0 かどうかの検定から得られる数値ベクトルとして返されます。

最終モデル。最終モデルに含まれる項を示す、X の列数に等しい長さの logical ベクトルとして返されます。

追加統計量。次のフィールドがある構造体として返されます。注意書きがなければ、すべての統計量は最終モデルに関するものです。

フィールド説明
source

文字ベクトル 'stepwisefit'

dfe

誤差に対する自由度

df0

回帰に対する自由度

SStotal

応答の二乗和の合計

SSresid

残差の二乗和

fstat

最終モデルを (平均値だけの) 空のモデルと対比する検定に関する F 統計量

pval

F 統計量の p 値

rmse

平方根平均二乗誤差

xr

最終モデルに含まれない項の残差。各項から最終モデルの予測応答を減算して計算する

yr

最終モデルの予測子を使用した応答に対する残差

B

すべての項を最終モデルに追加したと仮定した場合に得られる、最終モデルの各項に対する係数

SE

係数推定値に対する標準誤差

TSTAT

係数推定値に対する t 統計量

PVAL

係数推定値に対する p 値

intercept

切片の推定値

wasnan

NaN 値を含むデータの行

次の推奨ステップ。モデルに追加または削除する次の項のインデックスに等しい非負の整数として返されます。推奨ステップがそれ以上ない場合は 0 として返されます。

実行するステップの情報。次のフィールドをもつ構造体として返されます。

フィールド説明
B

各列が 1 つのステップで各行が 1 つの係数ベクトルである、回帰係数の行列

rmse

各ステップのモデルに対する平方根平均二乗誤差

df0

各ステップの回帰に対する自由度

in

ステップごとのモデル内予測子を示す logical 配列。各行が 1 ステップ、各列が 1 つの予測子。

詳細

すべて折りたたむ

stepwisefit の当てはめられたモデル

最終的な stepwisefit の当てはめられたモデルは次のとおりです。

y^=stats.intercept+X(:,finalmodel)*b(finalmodel).

ここで、

  • y^ は、予測された平均応答です。

  • stats.intercept は、切片の推定値です。

  • X(:,finalmodel) は、最終モデルの項に対する入力行列です。

  • b(finalmodel) は、最終モデルの項についての係数推定値のベクトルです。

アルゴリズム

"ステップワイズ回帰" は、各項の統計的な重要性に基づき、多重線形モデルに項を追加したり削除したりするための方法です。この方法では、初期モデルから開始し、そこから連続的にステップを実行して項の追加または削除をして、モデルを改良します。各ステップで、追加可能項がある場合とない場合のモデルを検定するために、F 統計量の p 値が計算されます。ある項が現在はモデルにない場合、帰無仮説は、項がモデルに追加された場合に係数ゼロをもつということです。帰無仮説を棄却する十分な証拠があれば、その項がモデルに追加されます。逆に、ある項がモデルに現在ある場合、帰無仮説は、その項が係数ゼロをもつことです。帰無仮説を棄却する十分な証拠がなければ、その項がモデルから削除されます。この方法は、以下のように進めます。

  1. 初期モデルを当てはめます。

  2. モデルにない任意の項が開始許容誤差よりも小さい p 値をもつ場合、最小の p 値をもつ項を追加し、このステップを繰り返します。たとえば、初期モデルが既定の定数モデルであり、開始許容誤差が既定値 0.05 であると仮定します。アルゴリズムでは、最初に、定数と別の項で構成されるすべてのモデルを当てはめ、最小の p 値をもつ項 (たとえば、項 4) を特定します。項 4 の p 値が 0.05 より小さい場合、項 4 がモデルに追加されます。アルゴリズムでは、次に、定数である項 4 と別の項で構成されるすべてのモデルに対して検索を実行します。モデルにない項が 0.05 よりも小さい p 値をもつ場合、最小の p 値をもつ項をモデルに追加し、このプロセスを繰り返します。モデルに追加可能な項がそれ以上存在しない場合、アルゴリズムはステップ 3 に進みます。

  3. モデルの任意の項が、終了許容誤差よりも大きい p 値をもつ場合、最大の p 値をもつ項を削除してステップ 2 に進みます。それ以外の場合は終了します。

アルゴリズムの各ステップにおいて、stepwisefit は最小二乗法を使用してモデル係数を推定します。アルゴリズムは、前の段階でモデルに項を追加した後、後から追加した他の項との組み合わせに役立たなくなった場合、その項を削除する可能性があります。この方法は、1 つのステップがモデルを改良することがないと終了します。ただし、最終モデルが最適である (つまり、データに対する最適な当てはめをもつ) ことを保証するものではありません。異なる初期モデルまたは異なるステップの順序を使用すると、当てはめが向上する場合があります。この意味において、ステップワイズ モデルは、局所的には最適でも、大域的には必ずしも最適ではありません。

代替機能

  • fitlm を使用してモデルを作成し、次に stepaddTerms、および removeTerms を使用して手動でモデルを調整します。

  • テーブルにデータがあり、連続予測子とカテゴリカル予測子が混在している場合、または高次の交互作用項を潜在的に含む可能性があるモデル式を指定する場合は、stepwiselm を使用します。

  • stepwiseglm を使用して、ステップワイズ一般化線形モデルを作成します (たとえば、二項応答変数があり、分類モデルを当てはめる場合)。

参照

[1] Draper, Norman R., and Harry Smith. Applied Regression Analysis. Hoboken, NJ: Wiley-Interscience, 1998. pp. 307–312.

バージョン履歴

R2006a より前に導入