3

作成したデータサンプルに対して最尤コードを実行したいと思います。これは私がこれまでに持っているものです:

library("maxLik") 
data <- replicate(20, rnorm(100))
logLikFun <- function(param) {
mu <- param[1]
sigma <- param[2]
sum(dnorm(data, mean = mu, sd = sigma, log = TRUE))
}
mle <- maxLik(logLik = logLikFun, start = c(mu = 0, sigma = 1))
summary(mle)

20の各サンプルの平均と標準偏差を抽出する際に問題が発生しました。これに合うように適用関数を修正しましたが、まだ何も機能していません。何か案は?

4

2 に答える 2

5

find.mleデータのベクトルを取り、それに基づいて MLE を計算する関数 (この例では) を作成し、applyそれを の列に適用するために使用しますdata

library("maxLik") 
data <- replicate(20, rnorm(100))

find.mle = function(d) {
    logLikFun <- function(param) {
        mu <- param[1]
        sigma <- param[2]
        sum(dnorm(d, mean = mu, sd = sigma, log = TRUE))
    }
    maxLik(logLik = logLikFun, start = c(mu = 0, sigma = 1))$estimate
}

mles = apply(data, 2, find.mle)

これにより、推定値を含む 2x20 行列が得られます。

> mles
            [,1]      [,2]        [,3]       [,4]       [,5]        [,6]
mu    0.03675611 0.1129927 -0.06499549 0.04651673 0.06593217 -0.08753828
sigma 0.93497523 0.9817961  0.84734600 0.93139761 1.01083924  1.04114752
           [,7]       [,8]      [,9]       [,10]      [,11]       [,12]
mu    0.1629807 0.01665411 0.2306688 -0.02147982 0.07723695 0.009476477
sigma 1.0428713 1.01658241 1.0073277  0.99781761 0.99327722 0.983356049
           [,13]      [,14]      [,15]      [,16]     [,17]     [,18]
mu    0.06524147 0.02442983 -0.1305258 -0.1050299 0.1449996 0.1172218
sigma 1.04004799 0.89963009  0.9979824  1.0227063 0.9319562 0.9916734
           [,19]       [,20]
mu    -0.1288296 -0.05769467
sigma  0.9975368  0.89506586
于 2012-07-10T17:30:47.267 に答える
1

平均値と sd の最尤推定量 (以下、ML) 推定量を取得するために、関数を記述する必要はまったくないと思います。X が正規確率変数の場合、母集団平均と sd の ML 推定量は標本平均と標本 sd であり、標本平均は母集団平均の偏りのない推定量ですが、分散の ML 推定量には偏りがあることがわかります。 (下向き)、分散の分母は n-1 ではなく n であるためです。

したがって、R は標本の準分散 (自由度に対して補正) を計算します。これは偏りのない推定量であるため、ML 推定量ではありませんが、R 推定から ML 推定量を取得できます。単純に乗算するだけで済みます。 (n-1) (1/n) で、結果は分散の ML 推定値になります。平方根を適用すると、sd の ML 推定値が得られますが、私は簡単なものが好きなので、 sd by (n-1) (1/n) これがあなたの答えです。詳細な説明については、http://en.wikipedia.org/wiki/Varianceの人口分散と標本分散を参照してください。

これで、R で次のことを簡単に実行できます。

## Reproducing @ David Robinson code
install.packages('maxLik')
library("maxLik") 
set.seed(007)  ## making it reproducible
data <- replicate(20, rnorm(100))

find.mle = function(d) {
  logLikFun <- function(param) {
    mu <- param[1]
    sigma <- param[2]
    sum(dnorm(d, mean = mu, sd = sigma, log = TRUE))
  }
  maxLik(logLik = logLikFun, start = c(mu = 0, sigma = 1))$estimate
}

mles = apply(data, 2, find.mle)
apply(data, 2, function(x) c(Mean=mean(x), SD=(n-1)*(1/n)*sd(x))) # my simple answer.

# Comparing results:
> mles
           [,1]      [,2]        [,3]        [,4]       [,5]         [,6]        [,7]
mu    0.1386966 0.1304418 -0.03515036 -0.05065659 0.04170382 0.0007424064 -0.07625412
sigma 0.9540009 0.9442371  1.07218240  1.03162817 0.96140925 1.0274500157  0.87450358
            [,8]       [,9]      [,10]      [,11]      [,12]       [,13]       [,14]
mu    0.02024026 -0.1732926 0.03401213 -0.1254751 0.05263887 -0.01258275 -0.02843866
sigma 0.98456202  0.9628233 0.95087131  0.9912367 1.01347266  0.99542339  1.03761674
           [,15]       [,16]     [,17]      [,18]       [,19]    [,20]
mu    0.02441331 -0.03021781 0.2170172 0.02271656 -0.04946737 0.115728
sigma 1.03889635  1.02796932 1.0457951 1.07906578  0.93627993 1.009641

>  apply(data, 2, function(x) c(Mean=mean(x), SD=(n-1)*(1/n)*sd(x)))
          [,1]      [,2]        [,3]        [,4]       [,5]         [,6]        [,7]
Mean 0.1386966 0.1304418 -0.03515036 -0.05065659 0.04170382 0.0007424064 -0.07625412
SD   0.9492189 0.9395041  1.06680802  1.02645707 0.95659012 1.0222998579  0.87012008
           [,8]       [,9]      [,10]      [,11]      [,12]       [,13]       [,14]
Mean 0.02024026 -0.1732926 0.03401213 -0.1254751 0.05263887 -0.01258275 -0.02843866
SD   0.97962684  0.9579971 0.94610501  0.9862680 1.00839257  0.99043377  1.03241563
          [,15]       [,16]     [,17]      [,18]       [,19]    [,20]
Mean 0.02441331 -0.03021781 0.2170172 0.02271656 -0.04946737 0.115728
SD   1.03368881  1.02281656 1.0405530 1.07365689  0.93158677 1.004580

したがって、単純な製品を使用するだけの場合は、関数 (@David Robinson によって作成された非常に優れた関数) を削除できます。これは単純な理論上の統計的観点です。

于 2012-07-11T23:41:39.117 に答える