您應該使用截斷的正態分佈,但mean
應該重新校準。如果您看rtnorm
中的mean
,則明確指出:mean
是截斷前原始正態分佈的均值。
如果你想可觀測平均值等於期望值,只是用公式從Truncated Normal:
mu = E + sigma*(f(b) - f(a))/(F(b) - F(a))
這裏E
是什麼意思價值,你想有(70,000你的情況),f(x)
是高斯密度,F(x)
是累積函數,a
和b
是區間邊界(居中和縮放)。
a = (LB - mu)/sigma
b = (RB - mu)/sigma
你計算mu
之後,它向下傳遞到rtnorm爲mean
參數。
注意:您可能想要做類似的工作與sigma
- 這是怎麼回事成rtnorm是不是你打算在抽樣觀察,再次看到維基參考
UPDATE
好東西,就到了自己編碼,儘管第一次剪切是在Python中完成的(現在正在查看R)。問題在於,對於給定的可觀察平均值mu
在f(a)
,f(b)
,F(a)
和F(b)
中,其將問題轉換爲搜索非線性方程的根。但它是可以解決的,請檢查code。請注意,它遵循幾乎維基表示法。
例如,對於您的參數和sigma = 12,000我
Found mu = 68430.372119287 for the desired mean 70000.0 and sigma 12000.0
Sampled 100000 truncated gaussians and got observed mean = 70023.15990337673
爲了您的參數和sigma = 24000我
Found mu = 52275.475000378945 for the desired mean 70000.0 and sigma 24000.0
Sampled 100000 truncated gaussians and got observed mean = 69922.16000288539
所以mu
越來越相當接近左邊界對於大sigma
,這是預期的行爲,但觀察到的平均停留接近70,000,這是你想要的。
UPDATE II
這裏是[R代碼,在github上回購以及
require(rootSolve)
require(msm)
phi <- function(z) {
dnorm(z)
}
Phi <- function(z) {
pnorm(z)
}
Mean <- function(mu, sigma, a, b) {
alfa <- (a - mu)/sigma
beta <- (b - mu)/sigma
Z <- Phi(beta) - Phi(alfa)
mu + sigma*(phi(alfa) - phi(beta))/Z
}
f <- function(mu, mean, sigma, a, b) {
mean - Mean(mu, sigma, a, b)
}
a <- 50000.0
b <- 250000.0
mean <- 70000.0
sigma <- 24000.0
# find mu for desired mean
q <- uniroot(f, c(a, b), mean, sigma, a, b)
mu <- q$root
print(sprintf("Found mu = %f for the desired mean %f and sigma %f", mu, mean, sigma))
# sampling test
set.seed(32345)
N = 100000
r <- rtnorm(N, mean=mu, sd=sigma, lower=a, upper=b)
print(sprintf("Sampled %d truncated gaussians and got observed mean = %f", N, mean(r)))
你想從你的生成隨機樣本分佈是什麼?此鏈接可能有所幫助:http://r.789695.n4.nabble.com/how-to-generate-a-normal-distribution-with-mean-1-min-0-2-max-0-8-td3481450 .html – Chrisss
謝謝@Chrisss,我發現我並不是在尋找一個特定的發行版,儘管我所做的所有研究都是以普通版和測試版爲導向的,但我相信這兩者中的一個可以通過觀察它們的密度函數形狀。 –
順便說一句,你想要什麼西格瑪?同樣,你想要公式西格瑪還是可觀察西格瑪?我在兩個小時內飛行,但只要我回來,我會嘗試寫一些** R ** ... –