専門家に聞いた!繰り返す痔の原因は!? >>

A1・・・A1001にx軸の値が
B1・・・B1001にy軸の値が入っているとします。
このデータをグラフ化したのちに、ガウシアン関数y=a+b*exp(-(x-c)^2/d^2)に対してフィッティングを行い、それぞれの定数を算出及び、その算出されたグラフを上に乗せるということをしたいのですが、
Excel VBAを使ってどのようにすれば良いのでしょうか?

また、ピークが1本ではなく2本ある場合Multipeak Gaussian fittingというものでそれぞれのピークに対してフィッティングすることもできるそうなのですが、できればその方法についても教えて頂けないでしょうか?

自分でひな形くらい作って質問したいところですが、全くどうやって作れば良いのか検討もつかないのでどなたかよろしくお願い致します。

A 回答 (1件)

こんにちは、



http://nuclear.phys.tohoku.ac.jp/~ykoba/latex2ht …

これのことですか???

これのことなら、二次の最小二乗法を理解していれば
でるようですが、

これの事とは、違うのですか。
若干ガウシアンの式の形が違うようですが。


マルチは、ちょっと解りません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qガウシアン関数へのフィッティングについて

現在、ガウシアン関数y=a+b*exp(-(x-c)^2/d^2)に下記のようなデータを使用しフィッティングを行いたいのですが、
手法やパラメータa,b,c,dの求め方がわかりません。
どなたか教えていただけませんか。
よろしくお願いいたします。
(x,y)={
48.8006092
48.8056105
48.8105942
48.8156000
48.8206021
48.8256127
48.8306131
48.8356169
48.8406146
48.8456077
48.8506141
48.8556236
48.8606115
48.8656179
48.8706296
48.8756176
48.8806272
48.8856294
.....}

Aベストアンサー

Excelしか使えないのであれば、ソルバーを使って、以下の手順で「残差2乗和」を最小とするパラメータ a, b, c, d を探すと良いでしょう。ただし、パラメータの初期値があまりかけ離れていると変な値に収束するか解が見つかりません。a, b, c は元のデータのグラフから見当をつけられると思います( a はベースライン高さ、b はピーク高さ、 c はピーク位置x)。d は直感では見当をつけられないので、(ピークの半値全幅)/1.67 で計算してそれを初期値としてください。

【ソルバーを使った最小自乗法】
(1) Excelのメニューの [ツール] → [アドイン] で [ソルバーアドイン] の左側の□をチェックして OK
(2) A列に x データ、B列に y データを書き込む( x は A1 から、y は B1 から下方向に書き込む)
(3) D1からD4にフィッティングパラメータの初期値を書き込む(a → D1、b → D2、c → D3、d → D4)
(4) セル C1 に以下の式を貼り付ける(これをCopy&Paste)
   =($D$1+$D$2*EXP(-1*(A1-$D$3)^2/($D$4)^2)-B1)^2
(5) セルC1をコピーして、C2以下の全データ分のC列にペースト(これでC列=「残差2乗」となる)
(6) セルD5 に =sum(C1:C??)と書く(??はC列最後の行番号)
(7) Excelのメニューの [ツール] → [ソルバー] で [目的セル」を $D$5、[目標値] を 最小、[変化させるセル]を $D$1:$D$4 とする。この意味は、「セルD1~D4に書かれている数値を変化させて、 D5セルを最小となるようにする」ということです。
(8) ソルバーウィンドウのオプションボタンをクリック → 制限時間を 1000、反復回数を 1000、精度・公差・収束をすべて 1e-10 とし、OKをクリック
(9) ソルバーウィンドウの実行ボタンをクリック
(10) フィッティングパラメータが見つかったら、「最適解が見つかりました・・」と出るので、OKをクリック
(11) ExcelのセルD1~D4にフィッティングパラメータが書き込まれている

なお、精度・公差・収束の値をあまり小さくすると収束しないので、もしデータのばらつきが大きくて収束しないときは、これらの値を適宜、大きくしていってみてください。ご質問のデータはGaussianのほんの1部でしたのでこちらで実験することはできませんでした。ちなみに私は通常、カレイダグラフというグラフソフトで任意関数のフィッティングをやっています。

Excelしか使えないのであれば、ソルバーを使って、以下の手順で「残差2乗和」を最小とするパラメータ a, b, c, d を探すと良いでしょう。ただし、パラメータの初期値があまりかけ離れていると変な値に収束するか解が見つかりません。a, b, c は元のデータのグラフから見当をつけられると思います( a はベースライン高さ、b はピーク高さ、 c はピーク位置x)。d は直感では見当をつけられないので、(ピークの半値全幅)/1.67 で計算してそれを初期値としてください。

【ソルバーを使った最小自乗法】
(1...続きを読む

Qエクセルでノイズ値を除去する方法。

エクセルでノイズ値を除去できませんか。
ノイズ値除去をしたく、ネットで調べるとフーリエ変換という言葉が出てきます。
しかし、今一よくわかりません。
具体的には、
「2、5、7、5、8、21、6、10」という8個の数値があった場合に、
「21」をノイズ値として除去したいです。
実際にできるのでしょうか。
やり方を教えてください。宜しくお願いします。

Aベストアンサー

#1です.

3σの外を切るような乱暴な方法とか,
はたまた,外れ値は自動的には除去できないとか,無責任な回答があったので,
修正しておきます.

私は,「ノイズを除去しても欠測値にはしない」という立場で書いてきましたが,
除去でよいのなら,次のような取り除き方があります.

まずベースラインを補正します.
これは例えば,小学生の身長のように,学年に比例する観測値なら
学年に比例する分を取り除き,一定信号に基準化する作業です.

次に全体のヒストグラムを作ります.
これが,フーリエ変換のような作業だと考えて下さい.

運よく二山になったら,山の隙間のどこかに閾値(しきい値)をとって,上側の山を切り落とします.
これはローパスフィルタのような作業です.

二山にならず,肩のこぶのようになっていたら,
ここから先はエクセルでは無理かと思いますが,
ガウス分布やガンマ分布をあてはめて,二山をフィットします.
次にそれらの関数を使って,閾値を決めます.
閾値は,第1種の過誤(α)と第2種の過誤(β)が同じになるように決め,
原信号の犠牲比率とノイズの混入比率を同等にします.
次に,閾値から上側を切り落とします.

このように,ノイズの除去には原信号の犠牲が伴い,
それに対する配慮が必要であることを分かって頂けたと思います.
3σの外を切るような乱暴な話ではありません.

#1です.

3σの外を切るような乱暴な方法とか,
はたまた,外れ値は自動的には除去できないとか,無責任な回答があったので,
修正しておきます.

私は,「ノイズを除去しても欠測値にはしない」という立場で書いてきましたが,
除去でよいのなら,次のような取り除き方があります.

まずベースラインを補正します.
これは例えば,小学生の身長のように,学年に比例する観測値なら
学年に比例する分を取り除き,一定信号に基準化する作業です.

次に全体のヒストグラムを作ります.
これが,フーリエ変換のよ...続きを読む

Qエクセル STDEVとSTDEVPの違い

エクセルの統計関数で標準偏差を求める時、STDEVとSTDEVPがあります。両者の違いが良くわかりません。
宜しかったら、恐縮ですが、以下の具体例で、『噛み砕いて』教えて下さい。
(例)
セルA1~A13に1~13の数字を入力、平均値=7、STDEVでは3.89444、STDEVPでは3.741657となります。
また、平均値7と各数字の差を取り、それを2乗し、総和を取る(182)、これをデータの個数13で割る(14)、この平方根を取ると3.741657となります。
では、STDEVとSTDEVPの違いは何なのでしょうか?統計のことは疎く、お手数ですが、サルにもわかるようご教授頂きたく、お願い致します。

Aベストアンサー

データが母集団そのものからとったか、標本データかで違います。また母集団そのものだったとしても(例えばクラス全員というような)、その背景にさらならる母集団(例えば学年全体)を想定して比較するような時もありますので、その場合は標本となります。
で標本データの時はSTDEVを使って、母集団の時はSTDEVPをつかうことになります。
公式の違いは分母がn-1(STDEV)かn(STDEVP)かの違いしかありません。まぁ感覚的に理解するなら、分母がn-1になるということはそれだけ結果が大きくなるわけで、つまりそれだけのりしろを多くもって推測に当たるというようなことになります。
AとBの違いがあるかないかという推測をする時、通常は標本同士の検証になるわけですので、偏差を余裕をもってわざとちょっと大きめに見るということで、それだけ確証の度合いを上げるというわけです。

Q指数関数のカーブフィッティング

時間tに対する1chデータ列yがありまして、それを
y=a exp(b t) + c
に対して客観的に、できれば自動的にフィッティングして、a,b,cを求めたいです。
これがただの1次関数の最小二乗法ならわかりますし、cが既知なら1次関数の応用で、というところまでもわかります。恥ずかしながら渡井には非線形最小二乗法を一般論で理解して解けるような気がしません。

Excelを使った最小二乗法手順説明サイト
http://szksrv.isc.chubu.ac.jp/lms/lms2.html
のような方法か、
C/C++のプログラム
http://www.sist.ac.jp/~suganuma/kougi/other_lecture/SE/predict/predict.htm#2
のようなアルゴリズムの説明をいただけると大変ありがたいです。

よろしくお願いします。

Aベストアンサー

回答が寄せられていませんので考えてみました。
ヒントになれば幸いです。

最小二乗法は直線に当てはめる場合の方法です。
y-c=aexp(bt)
の両辺の対数を取ると
ln(yーc)=ln(a)+bt
です。cが分かればできるのだがと書かれているのはこの式のことですね。
ならばcを推定する手順を入れたらと考えました。

時系列t1、t2、t3、・・・が等間隔とします。
ln(y2-c)-ln(y1-c)=b(t2-t1)=bτ
ln(y3-c)-ln(y2-c)=b(t3-t2)=bτ
ln(y4-c)-ln(y3-c)=b(t4-t3)=bτ

(y2-c)/(y1-c)=k
(y3-c)/(y2-c)=k
(y4-c)/(y3-c)=k

(yn-c)は等比数列になっているはずです。
y1、y2、y3に対して
(y2-c)/(y1-c)=(y3-c)/(y2-c)
より
c=(y1y3-y2^2)/(y1+y3-2y2)
が決まります。
y2、y3、y4に対しては
c=(y2y4-y3^2)/(y1+y4-2y3)
が決まります。
データがばらついていますからこのcもばらつきます。
さしあたり平均で推定していいのではないでしょうか。この値を計算して平均を求めるアルゴリズムはやさしいはずです。
全データでなくて一部でやっても構わないはずです。時間が等間隔でなければ等間隔の部分を抜き出してやればいいです。cの分布の幅も押さえておくといいでしょう。後でcを修正するときに必要になります。

cの値が推定できればln(y-c)とtのグラフを作って最小二乗法でa、bが決まります。もし適合の指標のような値も同時に得られるのでしたら少しcの値を動かして比べてみるといいと思います。cの分布の幅が分かっているとcの値を動かす目安になります。平均でやったのとあまり違わなければ平均でもいいということになります。

ご質問を見て考えたものです。素人っぽい考えかたです。

回答が寄せられていませんので考えてみました。
ヒントになれば幸いです。

最小二乗法は直線に当てはめる場合の方法です。
y-c=aexp(bt)
の両辺の対数を取ると
ln(yーc)=ln(a)+bt
です。cが分かればできるのだがと書かれているのはこの式のことですね。
ならばcを推定する手順を入れたらと考えました。

時系列t1、t2、t3、・・・が等間隔とします。
ln(y2-c)-ln(y1-c)=b(t2-t1)=bτ
ln(y3-c)-ln(y2-c)=b(t3-...続きを読む

Qエクセルのグラフから半値幅を求めたいです

例えば正規分布のようなデータをエクセルで作成しました(ピークがあるグラフになります。)
そのグラフから半値幅をエクセル上で求めたいです。
内挿法も考えましたが扱うデータのサンプルポイント数が少なくて誤差が大きすぎるのです。
今はグラフをプリントアウトして定規と日比例計算から半値幅を求めています。
何か方法をご存じのかた教えていただけますか。

Aベストアンサー

多分そこまで都合の良い方法は無いのではないかという気がします。
私が思いつく方法は2つです。
一つは、そのデータを関数で近似して(GaussianならGaussianで)、近似した関数から半値幅を計算する方法です。
これは近似が信頼できるのなら十分妥当な値が出ますし、もう一つの方法と比べて望ましい手法(理由は後述)です。
もう一つは、離散点の最大値の1/2になる値の幅を数値的に求める方法です。例えば、最大値をy0として、y=y0/2のx軸と平行な直線とデータとの交点を求め、その交点のx座標を半値半幅とします。
ただし、y0/2のラインとちょうど同じy値をデータが持つとは限らないので、少なくとも、近傍のデータ2点から直線を求め、その直線との交点を求める必要があります(できれば3点で2次曲線との交点にする等の方が精度が高くなる)。
こういうことをエクセルで行おうとすると、ワークシートでは無理で、Visual Basicでプログラムを組む必要があるでしょう。
そして何よりも、データに誤差が含まれている(バラつきがある)場合、最大値にも誤差が含まれることになりますから、y0/2にも誤差があり、そして交点を求めるために使用するデータにも誤差があり、ということで求める半値幅がどれくらい信頼できるかは分かりません。
その点、初めの方の関数で近似する方は、誤差が多少あっても近似が妥当であれば、そこそこ信頼できる値が求まるでしょう。
ただし近似(フィッティング)も、エクセルのワークシートだけだと難しいものもあるかもしれません(例えばGaussianのフィッティングはワークシートの関数では無理ではないかと思います)。
その場合はやはりプログラムを組む必要がありますし、その際、最小二乗法の勉強等も必要になるかもしれませんが、測定データ等を既知の関数でフィッティングするのはごくありふれた(ということは信頼できる)手法ですので、お勧めしておきます。
ただ、いずれの方法でも、あるいはいかなる方法でも、データ点数が少なすぎると、当然信頼度は下がります。
それは半値幅を求める手法に関する検討とは別の問題です。

多分そこまで都合の良い方法は無いのではないかという気がします。
私が思いつく方法は2つです。
一つは、そのデータを関数で近似して(GaussianならGaussianで)、近似した関数から半値幅を計算する方法です。
これは近似が信頼できるのなら十分妥当な値が出ますし、もう一つの方法と比べて望ましい手法(理由は後述)です。
もう一つは、離散点の最大値の1/2になる値の幅を数値的に求める方法です。例えば、最大値をy0として、y=y0/2のx軸と平行な直線とデータとの交点を求め、その交点のx座標を半値半幅とします。
...続きを読む

QEXCELにてローパスフィルタを作成する

実験の測定データをEXCELでデータ整理しようと考えております。データ整理のためローパスフィルタをかけたいのですが、具体的にどういった式、もしくはEXCELの機能を使用したらいいのでしょうか?デジタルフィルタが良く分からないのでよろしくお願いします。
ちなみにローパスフィルタは1000Hzをかけたいです。

Aベストアンサー

時系列データの処理ならば

OutputData(n+1) = OutputData(n) + (InputData(n+1) - OutputData(n)) * dt / T

dt:データのサンプリング間隔
T:フィルタの時定数 1/2πf
f:カットオフ周波数
n,n+1:それぞれn個目,n+1個目のデータをしめす。

でいけると思いますが、一次のパッシブなんで効果が薄いかも。(普通はベッセルかけるんでしょうけど、そこまではわからない)

Qエクセルの関数による近似式の求め方

(1)1,2,3,4 (2)5,6,7,8
(1)と(2)の二つの数字があります。
(1)をx軸、(2)をy軸としてエクセルの関数の式のみでy=a*x^2+b*x+cを求める事は可能ですか?
現状は(1)(x軸)と(2)(y軸)からグラフを書き近似曲線を描かせ、2次の多項式を表示させているんですが、大量にデータがあり、この作業に大変時間を要しています。調べに調べた結果、y=a*x+bの形は関数で表示可能なことは確認取れているんですが、2次の式は未だ発見できません。
非常に困っています。回答の方よろしくお願いします。また何か不明な点があったら何でも言って下さい。

Aベストアンサー

y の範囲 A2:A10
x の範囲 B2:B10
として、
C2=B2^2
C10までコピー。

と、しておけば
係数 a =INDEX(LINEST(A2:A10,B2:C10),1)
係数 b =INDEX(LINEST(A2:A10,B2:C10),2)
定数 c =INDEX(LINEST(A2:A10,B2:C10),3)

Qフィッティング

何らかのピークのデータがあるとしますよね?それをデータ解析するのにフィッティングします。そのときよくあるガウシアンとローレンツィアン。これらがどういうフィッティングなのかを知りたいです。これを知らなかったらどういう場合にどういうフィッティングをしたらいいのかわかりませんよね?例えば、何を見たらのってたりするものなのでしょうか?自分で探してみたけど見つかりません。しかも今現在そのフィッティングが目の前まで差し迫ってきています。誰か助けて!

Aベストアンサー

ガウシアンは最もよく出てくる分布で
 f(x) = 1/(σ√2π)^(1/2)exp{-(x-μ)^2/(2σ^2)}
という形をしています。
ここで、μは平均、σ^2は分散です。

ローレンチアンは、共鳴曲線などで見かける分布で
 g(x) = (1/π)β/{β^2+(x-α)^2}
という形になっています。
こちらは、平均はαですが分散は発散しています。

式を見ればわかるように、ローレンチアンのほうが減衰が遅く裾が広いですね。

Qガウス形とローレンツ形

波形でよく出てくるガウス形とローレンツ形ですが、これら半値幅とピークの高さがわかれば形が決まりますよね。
そこで、半値幅とピーク高さの値が求まったとして、面積を求めたいと思っています。半値幅とピーク高さでガウス形とローレンツ形の面積を表わすことができるのでしょうか?面積の公式ってあるのでしょうか?

数学に詳しい方、よろしくお願いいたします。

Aベストアンサー

ガウス(Gauss)型曲線は
(1)  G(x) = A exp(-a^2 x^2)
です.中心は x=0 としています.
曲線と x 軸との間の面積 S はよく知られた公式で
(2)  S = ∫{-∞~∞} G(x) = (A/a)√π
です.
一方,ピーク値はもちろん A,
半値幅 w は,高さがピーク値の半分になる幅ですから,
x=±w/2 で G の値が A/2.
すなわち
(3)  exp(-a^2 w^2 / 4) = 1/2
で,これから
(4)  w = 2√(ln 2)/a  ⇔  a = w/2√(ln 2)
です.
(4)を(2)に代入して,ピーク値 A を考慮すればできあがり.

ローレンツ(Lorentz)型は
(5)  L(x) = B/(x^2 + Γ^2)
の形.前と同じく中心は x=0 としています.
ピーク値は x=0 とおいて B/Γ^2 ですね.
こちらも面積の積分は簡単で
(6)  S = ∫{-∞~∞} L(x) = Bπ/Γ
半値幅は
(7)  B/{(w/2)^2 + Γ^2} = (1/2) B/Γ^2
から
(8)  w = 2Γ  ⇔  Γ = w/2
(6)に(8)を代入して,ピーク値 B/Γ^2 を考慮すればできあがり.

ガウス(Gauss)型曲線は
(1)  G(x) = A exp(-a^2 x^2)
です.中心は x=0 としています.
曲線と x 軸との間の面積 S はよく知られた公式で
(2)  S = ∫{-∞~∞} G(x) = (A/a)√π
です.
一方,ピーク値はもちろん A,
半値幅 w は,高さがピーク値の半分になる幅ですから,
x=±w/2 で G の値が A/2.
すなわち
(3)  exp(-a^2 w^2 / 4) = 1/2
で,これから
(4)  w = 2√(ln 2)/a  ⇔  a = w/2√(ln 2)
です.
(4)を(2)に代入して,ピーク値 A を考慮すればできあがり.

ローレンツ(Lorentz)...続きを読む

Qガウシアンフィッティングのアルゴリズム

c言語等を用いて実験データの解析を行おうと思っています。

データの形式は(x・・・時間軸、y・・・値)の列になっていて、
これをグラフにすると、パルス状の波形が連続する形になっています。

求めたい情報は、各パルス波形の山に対応する時刻の羅列
なのですが、現在ではガウス曲線近似機能のついたグラフソフトで、
一個一個手作業で求めています。

これを、解析プログラムを作って自動化しようと思っているのですが、
ガウス曲線(鋭い立ち上がりの)に近い部分を自動的に検出する方法、
また、フィッティングを数値計算的に行う方法がわかりません。

このようなアルゴリズムを考える上で参考になるようなHPや文献を
ご存知の方がいらっしゃれば、教えていただきたいと思っています。

Aベストアンサー

パルスを探すアルゴリズムの具体的な文献はしりませんが、
たとえば、xが小さい方から順にyの値を見ていき最大値を探し
yが一定値以下になったら次の最大値を探し始めるようなのでは
どうでしょうか。

言葉で説明すると難しいのでコードで示すと以下のようになると
思います。(適当に書いたのでバグがあるかも。)

int i;
int flag_peak=0; /* 0: 谷 1: 山 */
float y_max=0;
float x_peak=0;
float x[1000], y[1000]; /* data */
/* ここで x と y の配列にデータをセットする。 */
for(i=0; i<1000; i++){
 if( y[i]<50 ){
  if( flag_peak ==1 ) printf("peak %d %d\n", x[i], y[i]);
  flag_peak=0;
  y_max=0;
 }
 if( y[i]<80 ) continue;
 if( y_max<y[i] ) {
  y_max = y[i];
  x_peak = x[i];
 }
 flag_peak=1;
}

ここで、パルスは上向きで最大値が常に80以上になる、
パルス間の谷は常に50以下になることを仮定しています。
この50と80の差はyのふらつきを考慮したものです。
また、データは xについてソートされているものとしています。

このパルスの位置は最大値の場所と定義していますが、
フィッティングする場合は、この値を フィッティングの初期値として
使うことになると思います。

フィッティングは、最小二乗法や 最尤推定法 (maximum likelihood method)
などがあります。ふつうは最小二乗法かな? データ処理や統計処理の教科書に
載っていると思います。たぶん。

長くなってすみません。

パルスを探すアルゴリズムの具体的な文献はしりませんが、
たとえば、xが小さい方から順にyの値を見ていき最大値を探し
yが一定値以下になったら次の最大値を探し始めるようなのでは
どうでしょうか。

言葉で説明すると難しいのでコードで示すと以下のようになると
思います。(適当に書いたのでバグがあるかも。)

int i;
int flag_peak=0; /* 0: 谷 1: 山 */
float y_max=0;
float x_peak=0;
float x[1000], y[1000]; /* data */
/* ここで x と y の配列にデータをセットする。 */
for(i=...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング