No.13624 3次元データの分布パラメータの推定について  【張 樹槐】 2010/10/18(Mon) 11:31

大変参考になっております。さて,タイトルの問題について,しばらく考えたのですが,なかなか解決できず,質問させていただきます。

下記のような3次元計測データがあります。2次元正規分布に近い形をしています。
X1 X2 ... Xn
Y1 Z11 Z12 ... Z1n
Y2 Z21 Z22 ... Z2n
. . . .
. . . .
. . . .
Yn Zn1 Zn2 ... Znn

行 いたい解析は,上記データから2次元正規分布に近似した場合のパラメータを推定することです。例えば,平均,分散と近似精度です。最小二乗法や混合分布モ デル推定などを考えてみたが,Rの知識が不足していることもあり,具体的にどのようにやればいいのかについて,ぜひご教示お願いします。ヒントや参考にな る文献などでも構いません。

分布パラメータの推定と書いていますが,正確にいうと,近似曲面のパラメータ推定かもしれません。
 どうぞよろしくお願いします。

No.13629 Re: 3次元データの分布パラメータの推定について  【青木繁伸】 2010/10/18(Mon) 21:58

そもそも「3次元計測データがあります。2次元正規分布に近い形」というのがわからないですね。例示されたデータ 形式もどこが三次元データなのかZ自体でもn×n次元?x が列外にあるのはなぜとか,「2次元正規分布に近似」というのがわからないし,自分でも「正確にいうと,近似曲面のパラメータ推定かもしれません」という のだから,自分でわからないことは第三者にわかるわけないですよ。回答を求めないならともかく,他の質問にもあったけど,もう少し具体的に,丁寧に説明し てください。

No.13630 Re: 3次元データの分布パラメータの推定について  【ひの】 2010/10/18(Mon) 23:33

カーブフィッティングの問題を曲面に拡張しただけの話だと思います。カーブフィッティングの考え方や方法が理解できていればその簡単な拡張として解決できるはずです。
とっかかりとしてWikiのページを示しておきます。

http://ja.wikipedia.org/wiki/%E6%9B%B2%E7%B7%9A%E3%81%82%E3%81%A6%E3%81%AF%E3%82%81

No.13631 Re: 3次元データの分布パラメータの推定について  【張 樹槐】 2010/10/19(Tue) 08:58

青木先生,ひのさん

早速のご返事,ありがとうございます。ひのさんの言った通りで,サーフィス フィッテングの問題になります。いろいろと探したけど,カーブフィッテングに関する話が多くて,なかなか曲面まで拡張したソフトを見つけることができませ んでした。カーブフィッテングの考え方もある程度勉強しましたけど,全部自作となると,それなりに大変なので,何か既製ソフトを応用できないかなと思っ て,質問しました。

青木先生,いつもありがとうございます。説明の仕方がわるくて,大変失礼しました。簡単にいうと,計測した3次元デー タは,先生の下記アドレスにある図形をサンプリングしたものと似ています。やりたいのは,その計測データから元の図形(パラメータ)を推定したいというこ とです。

http://aoki2.si.gunma-u.ac.jp/lecture/Bunpu/2dim-normal.html

No.13634 Re: 3次元データの分布パラメータの推定について  【青木繁伸】 2010/10/19(Tue) 11:46

どこかで見たような質問だなあと思ったら,RjpWiki の中級者Q&A にあった,リンゴのお尻の窪みに曲面をフィットさせるというものでしたね。それが二次元正規分布と関係ないのではないかという指摘に,確率分布には意味が ないとのことでしたね。しかし,その曲面が数式で表せるかどうかは,その曲面の生成機序が大きく関わっていると思いますけどね。

曲面フィッティングは曲線フィッティングとなんら変わるところはありません。一変数なら曲線,二変数なら曲面,3変数以上なら超曲面。R なら optim でできるでしょう。
> # テストデータ生成(二次元正規分布,ただし,二変数は無相関とする)
> set.seed(123)
> func <- function(x, y) exp((-(x-mu.x)^2/sigma.x^2-(y-mu.y)^2/sigma.y^2+
+ 2*rho.xy*(x-mu.x)*(y-mu.y)/sigma.x/sigma.y)/
+ (2*(1-rho.xy^2)))/(2*pi*sigma.x*sigma.y*sqrt(1-rho.xy^2))
>
> size <- 20 # x, y 軸それぞれの座標点の数
> r.x <- 8
> x <- seq(mu.x-r.x, mu.x+r.x, length=size)
> r.y <- 10
> y <- seq(mu.y-r.y, mu.y+r.y, length=size)
> z <- matrix(0, size, size)
> mu.x <- 20 # mu.x, sigma.x, mu.y, sigma.y
> sigma.x <- 3
> mu.y <- 50
> sigma.y <- 5
> rho.xy <- 0.0
> for (j in 1:size) {
+ for (i in 1:size) {
+ z[i, j] <- func(x[i], y[j])
+ }
+ }
> xyz <- cbind(expand.grid(x, y), jitter(c(z), amount=0)) # z には誤差を加える
> xyz <- data.frame(xyz)
> colnames(xyz) <- letters[24:26]
> plot3d(xyz) # 添付図のようなデータになる
> write.table(xyz, "xyz") # データを書き出しておく
> head(xyz)
x y z
1 12.00000 40 -4.741088e-05
2 12.84211 40 2.033789e-04
3 13.68421 40 1.186800e-04
4 14.52632 40 4.312480e-04
5 15.36842 40 6.194453e-04
6 16.21053 40 4.574655e-04
> # あてはめを行う
> fn <- function(par) { # mu.x, sigma.x, mu.y, sigma.y を推定
+ mu.x <- par[1]
+ sigma.x <- par[2]
+ mu.y <- par[3]
+ sigma.y <- par[4]
+ rho.xy <- 0.0
+ ss <- 0 # 残差平方和
+ for (i in 1:nrow(xyz)) {
+ x <- xyz[i, 1]
+ y <- xyz[i, 2]
+ hat.z <- exp((-(x-mu.x)^2/sigma.x^2-(y-mu.y)^2/sigma.y^2+
+ 2*rho.xy*(x-mu.x)*(y-mu.y)/sigma.x/sigma.y)/(2*(1-rho.xy^2)))/
+ (2*pi*sigma.x*sigma.y*sqrt(1-rho.xy^2))
+ ss <- ss+(xyz[i, 3]-hat.z)^2
+ }
+ return(ss)
+ }
> xyz <- read.table("xyz", header=TRUE)
> par <- c(21, 2, 48, 4) # mu.x, sigma.x, mu.y, sigma.y の初期値
> optim(par, fn)
$par
[1] 20.004417 3.002613 49.981011 5.002016 # 推定結果

$value
[1] 5.509302e-06 # 残差平方和

$counts
function gradient
189 NA

$convergence
[1] 0 # 収束している

$message
NULL


No.13637 Re: 3次元データの分布パラメータの推定について  【張 樹槐】 2010/10/19(Tue) 13:32

青木先生
いつもいつもありがとうございます。
その通りです。同じ問題をRjpWikiの中級者Q&Aで質問しました。しかし,解決に至らず悩んでいて,ここに質問を出しました。
先生の具体的なコードを参考にして,何とかなる気がします。
ありがとうございました。

● 「統計学関連なんでもあり」の過去ログ--- 044 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る