2012-03-12 24 views
3

私は(各月の4年間の水需要は、人口や降雨量データ(1997年から2000年))、5列と48行を含むExcelファイルを持っているmatlabで繰り返し回帰を実行するには?

Year Month Water_Demand Population Rainfall 
1997 1  355  4500  25 
1997 2  375  5000  20 
1997 3  320  5200  21 
.............% rest of the month data of year 1997. 
1997 12  380  6000  24 
1998 1  390  6500  23 
1998 2  370  6700  20 
............. % rest of the month data of year 1998 
1998 12  400  6900  19 
1999 1 
1999 2 
.............% rest of the month data of year 1997 and 2000 
2000 12  390  7000  20 

私は中に複数の線形回帰をしたいですMATLAB。ここで、従属変数は水需要であり、独立変数は人口と降雨量である。私はこのコードを48行全てに書いています。

A1=data(:,3); 
A2=data(:,4); 
A3=data(:,5); 
x=[ones(size(A1)),A2,A3]; 
y=A1; 
b=regress(y,x); 
yfit=b(1)+b(2).*A2+b(3).*A3; 

私はこの繰り返しをしたいと思います。まず、行番号1を除外(つまり1997年の1年分のデータを除外)し、残りの47行のデータで回帰を行いたいとします。次に、行番号2を除外し、行番号1と行番号3〜48のデータで回帰を行いたいとします。次に、行番号3を除外し、行番号1-2と行4-48のデータで回帰を行います。私はそれぞれの実行で1つの行を除外するので、常に47行データポイントがあります。最後に、各回の回帰係数とyフィットを表にしたいと思います。

答えて

2

私は「この

C = zeros(3,number_of_lines); 
for n = 1:number_of_lines 
    under_test = data; 
    % this excludes the nth line of the matrix 
    under_test(n,:) = []; 
    B1=under_test(:,3); 
    B2=under_test(:,4); 
    B3=under_test(:,5); 
    x1=[ones(size(B1)),B2,B3]; 
    y1=B1; 
    C(:,n)=regress(y1,x1); 
end 

のように、ループとあなたが除外する行せずに持って正確に行列である一時的な「テスト中の」行列のために作成されたと考えることができます簡単な方法forループを使用せずにベクトルで動作するmatlab関数のいくつかを使ってこれを最適化することができます。しかし、私は48行だけで十分速いはずだと思います。

+0

+1オカムの剃刀用です。パフォーマンスが問題である場合にのみ最適化を自分自身を殺す。 – Marc

+0

ありがとうCastilho。しかし、コードを実行すると、48行目のみが除外され、係数の3 * 1行列の結果が得られますが、48回実行すると3 * 48の係数が得られます。ここでは、n = 1:48のunder_test = dataのコードがあります。 under_test(n、:) = []; B1 = under_test(:、3); B2 = under_test(:、4); B3 = under_test(:、5); x1 = [ones(size(B1))、B2、B3]; y1 = B1; C =回帰(y1、x1); end ' – shawpnik

+0

forループは、その内部に記述されたコードを繰り返します。すべての値を保存する場合は、適切なサイズの行列を作成し、各繰り返しの結果を別の行に保存する必要があります。私は上のコードを編集して、それだけを行いました。 :) – Castilho

関連する問題