5

特定の間隔で標準正規分布の平均を見つけたい。

たとえば、標準正規分布を 2 つに分割した場合 ([-Inf:0] [0:Inf])、それぞれの半分の平均を取得したいと考えています。

次のコードは、私が望むことをほぼ正確に実行します。

divide <- 2
boundaries <- qnorm(seq(0,1,length.out=divide+1))
t <- sort(rnorm(100000))
means.1 <- rep(NA,divide)
for (i in 1:divide) {
    means.1[i] <- mean(t[(t>boundaries[i])&(t<boundaries[i+1])])
  }    

しかし、これらの数値を計算するには、より正確な (そして洗練された) メソッドが必要です (means.1)。

次のコードを試しましたが、うまくいきませんでした (確率に関する知識が不足しているためかもしれません)。

divide <- 2
boundaries <- qnorm(seq(0,1,length.out=divide+1))
means.2 <- rep(NA,divide)
f <- function(x) {x*dnorm(x)}
for (i in 1:divide) {
  means.2[i] <- integrate(f,lower=boundaries[i],upper=boundaries[i+1])$value
}    

何か案は?前もって感謝します。

4

5 に答える 5

3

問題は、間隔 (-Inf から 0) での dnorm(x) の積分が 1 ではないことです。これが、間違った答えを得た理由です。修正するには、取得した結果を 0.5 (積分結果) で割る必要があります。お気に入り:

func <- function(x, ...) x * dnorm(x, ...)
integrate(func, -Inf, 0, mean=0, sd=1)$value / (pnorm(0, mean=0, sd=1) - pnorm(-Inf, mean=0, sd=1)) 

それをさまざまな間隔に適応させるのは簡単なはずです。

于 2013-04-12T18:03:33.980 に答える
2

fitdistr とベクトル インデックスを組み合わせて使用​​できます。

正の値のみの平均値と標準偏差を取得する方法の例を次に示します。

library("MASS")
x = rnorm(10000)
fitdistr(x[x > 0], densfun="normal")

または間隔(0,2)の値のみ:

fitdistr(x[x > 0 & x < 2], densfun="normal")
于 2013-04-12T17:56:25.047 に答える
2

カットポイントが -1、0、1、および 2 で、標準法線をシミュレートするセクションの平均に関心があるとします。

 samp <-   rnorm(1e5)
 (res <- tapply(samp, findInterval(samp, c( -1, 0, 1, 2)), mean) )
#         0          1          2          3          4 
#-1.5164151 -0.4585519  0.4608587  1.3836470  2.3824633 

ラベルは改善される可能性があることに注意してください。1つの改善点は次のとおりです。

names(res) <-  paste("[", c(-Inf, -1, 0, 1, 2, Inf)[-6],  " , ", 
                      c(-Inf, -1, 0, 1, 2, Inf)[-1], ")", sep="")
> res
[-Inf , -1)    [-1 , 0)     [0 , 1)     [1 , 2)   [2 , Inf) 
 -1.5278185  -0.4623743   0.4621885   1.3834442   2.3835116 
于 2013-04-12T18:00:18.550 に答える
1

distrExおよびdistrパッケージの使用:

library(distrEx)
E(Truncate(Norm(mean=0, sd=1), lower=0, upper=Inf))
# [1] 0.797884

(一連のdistrおよび関連パッケージの優れた概要については、 distrDocvignette(distr)パッケージを参照してください。)


lbまたは、基数 R のみを使用して、との間の間隔内で期待値の離散近似を構築する代替手段を次に示しますub。近似長方形の底辺は、それらがすべて等しい面積を持つように調整されます (つまり、点がそれぞれの長方形に入る確率が同じになるように)。

intervalMean <- function(lb, ub, n=1e5, ...) {
    ## Get x-values at n evenly-spaced quantiles between lower and upper bounds
    xx <- qnorm(seq(pnorm(lb, ...), pnorm(ub, ...), length = n), ...)
    ## Calculate expectation
    mean(xx[is.finite(xx)])
}

## Your example
intervalMean(lb=0, ub=1)
# [1] 0.4598626

## The mean of the complete normal distribution
intervalMean(-Inf, Inf)
## [1] -6.141351e-17

## Right half of standard normal distribution
intervalMean(lb=0, ub=Inf)
# [1] 0.7978606

## Right half of normal distribution with mean 0 and standard deviation 100
intervalMean(lb=0, ub=Inf, mean=0, sd=100)
# [1] 79.78606
于 2013-04-12T18:05:48.470 に答える