散布図の最小二乗法及び最小絶対値方による線形回帰
Show older comments
以下のプログラムでプロットした散布図を最小二乗法及び最小絶対値方、二つの方法で線形回帰したいのですが関数ありましたら教えて頂けると幸いです。 どちらも各データセットごとではなくプロットした全ての値から線形回帰したいの考えています。
for i = 1:12
hold on
if i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12
for j = 1:31
xfilename = sprintf('TA2004%02d%02d.txt',i,j);
yfilename = sprintf('TS2004%02d%02d.txt',i,j);
x = load(xfilename);
y = load(yfilename);
if i==1 && j == 1
scatter(x,y);
else
scatter(x,y);
end
end
elseif i==2
for j = 1:29
xfilename = sprintf('TA2004%02d%02d.txt',i,j);
yfilename = sprintf('TS2004%02d%02d.txt',i,j);
x = load(xfilename);
y = load(yfilename);
scatter(x,y);
end
else
for j = 1:30
xfilename = sprintf('TA2004%02d%02d.txt',i,j);
yfilename = sprintf('TS2004%02d%02d.txt',i,j);
x = load(xfilename);
y = load(yfilename);
scatter(x,y);
end
end
hold off
end
xlabel('surface temperature');
ylabel('near-surface air temperature');
1 Comment
Walter Roberson
on 9 Oct 2016
Approximate translation:
The method of least squares the scatter diagram plotted in the following program and the minimum absolute value hand, I want to linear regression in two ways, but I hope if you could tell me if you have a function. Both are thought to want to linear regression from all of the values plot rather than for each data set.
Answers (1)
最小二乗法での簡単な線形回帰は、多項式近似を行う polyfit が MATLAB 本体にありますが、最小絶対値法を使用して線形回帰を行う関数はありません。fminsearch関数などを使用して最適化問題としての実装が可能かと思います。
今回、コードから推察するに2004/1/1 から 2004/12/31 まで毎日観測した結果が保存された 366 x 2個のファイルから1つ1つデータを変数 x, y に読み込んで、散布図を作成されております。散布図の作成であれば1つ1つ処理すれば十分ですが、すべてのデータに対して線形回帰や相関係数を求める場合には、 上記の方法では難しいかと思います。
以前、すべてのデータをメモリに読み込むことが可能かという点について質問させていただきましたが、732個のファイルからのすべてのデータの散布図を描けているようですので、メモリの面では問題が無いのかと推察します。
実際にデータがどのように保存されているかによって多少のカスタマイズが必要ですが、
dsX = datastore('TA2004*.txt');
x = readall(dsX);
dsY = datastore('TS2004*.txt');
y = readall(dsY);
ですべてのデータファイルのデータを x, y に読み込むことができる関数です。
まずは、上記の datastore 関数の説明ページ、または下記のコマンドで挙動を確認してみてください。
dsX = datastore('TA2004*.txt')
preview(dsX)
15 Comments
Naoki Ishibashi
on 10 Oct 2016
ご理解の通り、
dsX = datastore('TA2004*.txt')
で、TAから始まる全てのファイルのデータを読み込むデータストア dsX を作成する意図で書きました。ファイルが見つからないとのエラーのようですが、
dir TA2004*.txt
の実行でファイルは検出されますでしょうか?
Naoki Ishibashi
on 10 Oct 2016
ファイルの場所も絶対パスで指定することもできますので、必要に応じて活用してください。例:
dsX = datastore('/Users/naoki/Documents/MATLAB/Add-Ons/HW2/TA-TS/TA*.txt')
さて、エラーですが TA20040101.txt のフォーマット(データがコンマで分けられているか、スペースか。一行目に変数名があるか等)が自動で認識できていないようです。その場合、 datastore 関数を実行する際にオプションでデータフォーマットを指定する必要があります。実際の設定は
の2ページに例題も合わせて情報がありますので参考にしてください。
もし何か問題・エラーが解消できないなどありましたら、読み取るべきファイルの内容(冒頭の数行だけでも)も頂ければある程度方向をお伝えできるかと思います。
Naoki Ishibashi
on 18 Oct 2016
元々のファイルではデータ値が入っているところがNaNとして読み込まれているということでしょうか。データの数(行数・列数)は正しく読み込まれているでしょうか。
そもそも「正しい」状態を想像するしかなく原因の特定は難しいですが、実際にこちらで現象を再現できるデータファイル・プログラムがあればより的確にコメントできるかと思います。可能であればよろしくお願いします。
公開は難しい・避けたいということでしたら、サポートが有効なライセンスが必要になりますがテクニカルサポートの利用もどうぞご検討ください。https://jp.mathworks.com/support/contact_us/
Naoki Ishibashi
on 18 Oct 2016
まず区切り文字が'スペース’と認識されていました。(区切り文字はデータを区切る文字列です。例:csvファイルの区切り文字はコンマ(,)) dsX のプロパティ Delimiter で確認できます。
また今回のテキストファイルの各行の先頭に2,3個の空白が存在します。結果、実際は値が入っていませんが、スペースで区切られた何かだと解釈され、NaNとして読み込まれています。これは MultipleDelimitersAsOne プロパティを true に変更することで対応できます。
他にも NumHeaderLines プロパティでファイルのヘッダー数を指定しますが、こちらが12と認識されていますので、正しく0に変更が必要です。以上まとめまして、下記でご所望の処理になるかと思います。
dsX = datastore ('TS2004*.txt');
dsX.MultipleDelimitersAsOne = true;
dsX.NumHeaderLines = 0;
x = readall(dsX);
Mx = max(x.Var1);
Mm = min(x.Var1);
V = var(x.Var1);
それぞれのプロパティの詳細は先日記載しましたリンク先ページを参照ください。
summary(x)
Naoki Ishibashi
on 18 Oct 2016
michio
on 18 Oct 2016
こちらでは再現しないエラーですね。まず疑われるのが var と同じ名前で定義された、独自の関数の存在、もしくは var という名前で定義された変数の存在です。
which -all var
で var コマンドで何が呼び出されるかを確認できます。もし
C:\Program Files\MATLAB\R2016a\toolbox\matlab\datafun\var.m
以外のものが先頭に表示される場合は、原因となる独自の関数、また変数の問題を解決する必要があります。(名前の変更など)
Naoki Ishibashi
on 18 Oct 2016
michio
on 20 Oct 2016
TA20040101.txtからTA20041231.txtまでデータ数が同じであれば簡単です。1つのファイルからのデータ数がN個であるとすると、
x = readall(dsX);
newdata = reshape(x.Var1,N,[]);
で Nx(ファイル数) の行列 newdata を作成できます。
データ数がファイル間で異なる場合は、、元々の方法で for-loop を使って一つ一つ読み、cell配列に保存していく方法になるかと思います。
Naoki Ishibashi
on 28 Oct 2016
michio
on 29 Oct 2016
以前と同じファイルですと、
dsX = datastore ('TS2004*.txt');
dsX.MultipleDelimitersAsOne = true;
dsX.NumHeaderLines = 0;
のオプション設定が有効かと思います。 dsX (datastore object) の各プロパティとデータの形式、そして出力結果とをにらめっこしながら確認して頂くのが確実です。
経験上下記の5つは要注目です。
- NumHeaderLines — ファイルの先頭でスキップする行数
- Delimiter — フィールドの区切り記号
- RowDelimiter — 行区切り記号文字
- Whitespace — 空白文字
- MultipleDelimitersAsOne — 複数の区切り記号の取り扱い
オプションも多く、それぞれ一つづつ確認するのは最初は大変かと思いますが、一度慣れていただきますとその他様々な形式のファイルに柔軟に対応できますので、是非一度挙動を確認してみてください。各オプション設定は
の2ページに例題も合わせて情報がありますので参考にしてください。
michio
on 29 Oct 2016
Categories
Find more on Text Data Preparation in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!