散布図の最小二乗法及び最小絶対値方による線形回帰

以下のプログラムでプロットした散布図を最小二乗法及び最小絶対値方、二つの方法で線形回帰したいのですが関数ありましたら教えて頂けると幸いです。 どちらも各データセットごとではなくプロットした全ての値から線形回帰したいの考えています。
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 件のコメント

Walter Roberson
Walter Roberson 2016 年 10 月 9 日
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.

サインインしてコメントする。

回答 (1 件)

michio
michio 2016 年 10 月 10 日
編集済み: michio 2016 年 10 月 10 日

1 投票

最小二乗法での簡単な線形回帰は、多項式近似を行う polyfit が MATLAB 本体にありますが、最小絶対値法を使用して線形回帰を行う関数はありません。fminsearch関数などを使用して最適化問題としての実装が可能かと思います。
今回、コードから推察するに2004/1/1 から 2004/12/31 まで毎日観測した結果が保存された 366 x 2個のファイルから1つ1つデータを変数 x, y に読み込んで、散布図を作成されております。散布図の作成であれば1つ1つ処理すれば十分ですが、すべてのデータに対して線形回帰や相関係数を求める場合には、 上記の方法では難しいかと思います。
以前、すべてのデータをメモリに読み込むことが可能かという点について質問させていただきましたが、732個のファイルからのすべてのデータの散布図を描けているようですので、メモリの面では問題が無いのかと推察します。
もし、R2014bより新しいバージョンのMATLABをご使用であれば、datastoreの使用をおすすめします: データストア入門
実際にデータがどのように保存されているかによって多少のカスタマイズが必要ですが、
dsX = datastore('TA2004*.txt');
x = readall(dsX);
dsY = datastore('TS2004*.txt');
y = readall(dsY);
ですべてのデータファイルのデータを x, y に読み込むことができる関数です。
まずは、上記の datastore 関数の説明ページ、または下記のコマンドで挙動を確認してみてください。
dsX = datastore('TA2004*.txt')
preview(dsX)

15 件のコメント

Naoki Ishibashi
Naoki Ishibashi 2016 年 10 月 10 日
ご解答頂きありがとうございます。私はR2016aを現在使用しているため上記にあるdatastoreのコードを試してみたのですが、以下のエラーが返ってきました。
Cannot find files or folders matching
ファイル名はTA20040101.txtからTA20041231.txtです。(TSも同様)私はTA2004*.txt で全てのファイルを読み込めると思ったのですが理解が間違っていますでしょうか? ファイルの場所も間違っていないと思います。何かアドバイス頂ければ幸いです。
michio
michio 2016 年 10 月 10 日
編集済み: michio 2016 年 10 月 10 日
ご理解の通り、
dsX = datastore('TA2004*.txt')
で、TAから始まる全てのファイルのデータを読み込むデータストア dsX を作成する意図で書きました。ファイルが見つからないとのエラーのようですが、
dir TA2004*.txt
の実行でファイルは検出されますでしょうか?
Naoki Ishibashi
Naoki Ishibashi 2016 年 10 月 10 日
ファイルの場所を全て変えやり直してみたらdir TA2004*.txtの実行でファイルは検出されるようになったのですが、以下の別のエラーがでてしまいました。
Error using datastore (line 163)
Cannot detect TextscanFormats from file:
'/Users/naoki/Documents/MATLAB/Add-Ons/HW2/TA-TS/TA20040101.txt'. Specify
TextscanFormats when you create the datastore. Verify the Text Format and
Advanced Text Format Properties.
Error in liner_regression (line 1)
dsX = datastore('TA2004*.txt');
michio
michio 2016 年 10 月 10 日
編集済み: michio 2016 年 10 月 10 日
ファイルの場所も絶対パスで指定することもできますので、必要に応じて活用してください。例:
dsX = datastore('/Users/naoki/Documents/MATLAB/Add-Ons/HW2/TA-TS/TA*.txt')
さて、エラーですが TA20040101.txt のフォーマット(データがコンマで分けられているか、スペースか。一行目に変数名があるか等)が自動で認識できていないようです。その場合、 datastore 関数を実行する際にオプションでデータフォーマットを指定する必要があります。実際の設定は
の2ページに例題も合わせて情報がありますので参考にしてください。
もし何か問題・エラーが解消できないなどありましたら、読み取るべきファイルの内容(冒頭の数行だけでも)も頂ければある程度方向をお伝えできるかと思います。
Naoki Ishibashi
Naoki Ishibashi 2016 年 10 月 18 日
ご教授頂いた方法でデータ読み込めたのですが、値がところどころNaNと出て正しく読み込めていないのですが、何か改善する方法ありますか? データストアのプロパティーも一応添付させて頂きます
michio
michio 2016 年 10 月 18 日
編集済み: michio 2016 年 10 月 18 日
元々のファイルではデータ値が入っているところがNaNとして読み込まれているということでしょうか。データの数(行数・列数)は正しく読み込まれているでしょうか。
そもそも「正しい」状態を想像するしかなく原因の特定は難しいですが、実際にこちらで現象を再現できるデータファイル・プログラムがあればより的確にコメントできるかと思います。可能であればよろしくお願いします。
公開は難しい・避けたいということでしたら、サポートが有効なライセンスが必要になりますがテクニカルサポートの利用もどうぞご検討ください。https://jp.mathworks.com/support/contact_us/
Naoki Ishibashi
Naoki Ishibashi 2016 年 10 月 18 日
データ数確認したところしっかり読み込まれていないようです テキストファイルの数は248個で合っています 一つのテキストに入っているデータ数は72 x 144 = 10368 全てのデータ数は2571264ですがreadallで出力した先のxのデータ数は10174839でした
以下プログラムです
dsX = datastore ('TS2004*.txt');
x = readall(dsX);
Mx = max(x);
Mm = min(x);
V = var(x);
もともとの質問時の目的とは大きく変わって全てのデータの中から最小、最大、分散値を求めたいです text file が入ったフォルダーも添付致します
michio
michio 2016 年 10 月 18 日
編集済み: michio 2016 年 10 月 18 日
まず区切り文字が'スペース’と認識されていました。(区切り文字はデータを区切る文字列です。例: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
Naoki Ishibashi 2016 年 10 月 18 日
ご丁寧にありがとうございます。 ただ実行してみたところ、データ数も合い、データ自体も恐らく正しく読み込めれているようなのですが以下のエラーが出てしまいました サイトで確認したところvar関数は数列の分散値を算出してくれると考えているのですが、エラーの原因がわかりません 度々申し訳ありませんがアドバイス頂けると幸いです。
Error in var (line 7)
V = var(x.Var1);
michio
michio 2016 年 10 月 18 日
こちらでは再現しないエラーですね。まず疑われるのが var と同じ名前で定義された、独自の関数の存在、もしくは var という名前で定義された変数の存在です。
which -all var
var コマンドで何が呼び出されるかを確認できます。もし
C:\Program Files\MATLAB\R2016a\toolbox\matlab\datafun\var.m
以外のものが先頭に表示される場合は、原因となる独自の関数、また変数の問題を解決する必要があります。(名前の変更など)
Naoki Ishibashi
Naoki Ishibashi 2016 年 10 月 18 日
ご指摘頂いた通り過去に作った関数でvarが存在しました、初歩的なミスで申し訳ないで。 またサイトでは見つけられなかったのですが x = readall(dsX); ですと縦にファイルの識別なくデータが羅列されます。 これをtextファイル毎に列をずらしてデータを入れることは難しいのでしょうか? つまりtext1のデータを一列目に出力、text2のデータを二列目にとずらしていくイメージです
michio
michio 2016 年 10 月 20 日
TA20040101.txtからTA20041231.txtまでデータ数が同じであれば簡単です。1つのファイルからのデータ数がN個であるとすると、
x = readall(dsX);
newdata = reshape(x.Var1,N,[]);
で Nx(ファイル数) の行列 newdata を作成できます。
データ数がファイル間で異なる場合は、、元々の方法で for-loop を使って一つ一つ読み、cell配列に保存していく方法になるかと思います。
Naoki Ishibashi
Naoki Ishibashi 2016 年 10 月 28 日
できました。ありがとうございます。 他のデータへも対応させようとしてみたのですが、 前と同じtextデータがdatastoreで自動認識できない問題が起きてしましったのですが、 どこに問題があって読み込めないのかなどわかるすべはあるのでしょうか? 問題点がわかればdatastoreのプロパティーを変更することで読み込めるので、もしありましたら教えて頂けると幸いです。
michio
michio 2016 年 10 月 29 日
以前と同じファイルですと、
dsX = datastore ('TS2004*.txt');
dsX.MultipleDelimitersAsOne = true;
dsX.NumHeaderLines = 0;
のオプション設定が有効かと思います。 dsX (datastore object) の各プロパティとデータの形式、そして出力結果とをにらめっこしながら確認して頂くのが確実です。
経験上下記の5つは要注目です。
  • NumHeaderLines — ファイルの先頭でスキップする行数
  • Delimiter — フィールドの区切り記号
  • RowDelimiter — 行区切り記号文字
  • Whitespace — 空白文字
  • MultipleDelimitersAsOne — 複数の区切り記号の取り扱い
オプションも多く、それぞれ一つづつ確認するのは最初は大変かと思いますが、一度慣れていただきますとその他様々な形式のファイルに柔軟に対応できますので、是非一度挙動を確認してみてください。各オプション設定は
の2ページに例題も合わせて情報がありますので参考にしてください。
michio
michio 2016 年 10 月 29 日

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeText Data Preparation についてさらに検索

質問済み:

2016 年 10 月 9 日

コメント済み:

2016 年 10 月 29 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by