3

堅牢なデータ フィッティング操作を行う必要があります。

ガウス(別名通常)関数に適合させたい(x、y)データがたくさんあります。要は、ウリエを取り除きたいということです。以下のサンプル プロットでわかるように、右側のデータを汚染しているデータの別の分布があり、フィッティングを行うために考慮したくありません (つまり、\sigma、\mu および全体的なスケール パラメータ)。 サンプル データ プロット

R はこの仕事に適したツールのようです。ロバスト フィッティングに関連するいくつかのパッケージ ( robustrobustbaseMASSなど) を見つけました。

ただし、彼らは、ユーザーがすでに R に関する十分な知識を持っていることを前提としていますが、これは私の場合ではなく、ドキュメントは一種のリファレンス マニュアルとしてのみ提供されており、チュートリアルや同等のものは提供されていません。私の統計的バックグラウンドはかなり低く、R のフィッティングに関する参考資料を読み込もうとしましたが、実際には役に立ちませんでした (そして、それが正しい方法かどうかさえわかりません)。しかし、これは実際には非常に簡単な操作だと感じています。

この関連する質問(およびリンクされているもの) を確認しましたが、値の単一のベクトルを入力として受け取り、ペアのベクトルを持っているため、転置する方法がわかりません。

これを行う方法についての助けをいただければ幸いです。

4

2 に答える 2

8

ガウス曲線をデータに当てはめます。原理は、当てはめた曲線とデータの間の二乗和の差を最小限に抑えることです。そのためf、目的関数を定義して実行optimします。

fitG =
function(x,y,mu,sig,scale){

  f = function(p){
    d = p[3]*dnorm(x,mean=p[1],sd=p[2])
    sum((d-y)^2)
  }

  optim(c(mu,sig,scale),f)
 }

これを 2 つのガウス分布に拡張します。

fit2G <- function(x,y,mu1,sig1,scale1,mu2,sig2,scale2,...){

  f = function(p){
    d = p[3]*dnorm(x,mean=p[1],sd=p[2]) + p[6]*dnorm(x,mean=p[4],sd=p[5])
    sum((d-y)^2)
  }
  optim(c(mu1,sig1,scale1,mu2,sig2,scale2),f,...)
}

最初のフィットからの初期パラメーターと、2 番目のピークの目視による推測でフィットします。最大反復回数を増やす必要があります:

> fit2P = fit2G(data$V3,data$V6,6,.6,.02,8.3,0.10,.002,control=list(maxit=10000))
Warning messages:
1: In dnorm(x, mean = p[1], sd = p[2]) : NaNs produced
2: In dnorm(x, mean = p[4], sd = p[5]) : NaNs produced
3: In dnorm(x, mean = p[4], sd = p[5]) : NaNs produced
> fit2P
$par
[1] 6.035610393 0.653149616 0.023744876 8.317215066 0.107767881 0.002055287

これはどのように見えますか?

> plot(data$V3,data$V6)
> p = fit2P$par
> lines(data$V3,p[3]*dnorm(data$V3,p[1],p[2]))
> lines(data$V3,p[6]*dnorm(data$V3,p[4],p[5]),col=2)

ここに画像の説明を入力

ただし、関数パラメーターに関する統計的推論には注意が必要です...

生成される警告メッセージは、おそらく sd パラメーターが負になることが原因です。L-BFGS-B を使用して下限を設定することで、これを修正し、より迅速な収束を得ることができます。

> fit2P = fit2G(data$V3,data$V6,6,.6,.02,8.3,0.10,.002,control=list(maxit=10000),method="L-BFGS-B",lower=c(0,0,0,0,0,0))
> fit2P
$par
[1] 6.03564202 0.65302676 0.02374196 8.31424025 0.11117534 0.00208724

指摘したように、初期値に対する感度は、このようなカーブ フィッティングでは常に問題になります。

于 2013-04-08T16:02:06.110 に答える
4

ガウスのフィッティング:

# your data
set.seed(0)
data <- c(rnorm(100,0,1), 10, 11) 

# find & remove outliers
outliers <- boxplot(data)$out
data <- setdiff(data, outliers)

# fitting a Gaussian
mu <- mean(data)
sigma <- sd(data)

# testing the fit, check the p-value
reference.data <- rnorm(length(data), mu, sigma)
ks.test(reference.data, data) 
于 2013-04-08T15:37:02.090 に答える