2016-09-23 91 views
2

我一直堅持這一段時間,所以我決定寫一個問題。R生成有界隨機樣本週圍特定平均值

問題:如何使用結合的下部/上部和角落找尋一個特定意味着生成(的lenght n)的隨機樣本。

觀察:分佈不需要具體(可能是正常的,測試版等)。

Aproaches認爲:

  • 一種形式給出是使用rtnorm功能(package msm)與指定範圍內的正態分佈產生一個隨機數,但它不會把你想要的平均值。
  • 我已經嘗試了第二的aproach是這個功能,我在一個問題中我找不到了

    rBootstrap <- function(n, mean, sd, lowerBound, upperBound){ 
        range <- upperBound - lowerBound 
        m <- (mean-lowerBound)/range #mapping mean to 0-1 range 
        s <- sd/range #mapping sd to 0-1 range 
        a <- (m^2 - m^3 - m*s^2)/s^2 #calculating alpha for rbeta 
        b <- (m-2*m^2+m^3-s^2+m*s^2)/s^2 #calculating beta for rbeta 
        data <- rbeta(n,a,b) #generating data 
        data <- lowerBound + data * range #remaping to given bounds 
        return(data) 
    } 
    

    這個功能實際上,除非給出了很大的成績:UPPERBOUND>下界+(2 *平均 - lowerBound)(上限超過了從lowerBound到mean的距離的兩倍)。

特別是,我想生成一個長度爲1,800的隨機樣本,值在50,000到250,000之間,平均值= 70,000。

+0

你想從你的生成隨機樣本分佈是什麼?此鏈接可能有所幫助:http://r.789695.n4.nabble.com/how-to-generate-a-normal-distribution-with-mean-1-min-0-2-max-0-8-td3481450 .html – Chrisss

+0

謝謝@Chrisss,我發現我並不是在尋找一個特定的發行版,儘管我所做的所有研究都是以普通版和測試版爲導向的,但我相信這兩者中的一個可以通過觀察它們的密度函數形狀。 –

+0

順便說一句,你想要什麼西格瑪?同樣,你想要公式西格瑪還是可觀察西格瑪?我在兩個小時內飛行,但只要我回來,我會嘗試寫一些** R ** ... –

回答

2

您應該使用截斷的正態分佈,但mean應該重新校準。如果您看rtnorm中的mean,則明確指出:mean是截斷前原始正態分佈的均值。

如果你想可觀測平均值等於期望值,只是用公式從Truncated Normal

mu = E + sigma*(f(b) - f(a))/(F(b) - F(a)) 

這裏E是什麼意思價值,你想有(70,000你的情況),f(x)是高斯密度,F(x)是累積函數,ab是區間邊界(居中和縮放)。

a = (LB - mu)/sigma 
b = (RB - mu)/sigma 

你計算mu之後,它向下傳遞到rtnorm爲mean參數。

注意:您可能想要做類似的工作與sigma - 這是怎麼回事成rtnorm是不是你打算在抽樣觀察,再次看到維基參考

UPDATE

好東西,就到了自己編碼,儘管第一次剪切是在Python中完成的(現在正在查看R)。問題在於,對於給定的可觀察平均值muf(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))) 
+0

謝謝,在這種情況下,f(a)將是我想要的下限?如果F(a)= 0,反之f(b)和F(b)= 1? –

+0

@AlfredoLozano我已經更新了wrt'a'和'b'。不,如果你看wiki的話,'\ phi(x)'是純高斯的,'\ Phi(x)'是高斯的累積(誤差函數的變化),所以F(a)不是0,F b)不是1 –

+0

@AlfredoLozano您必須對西格瑪有一定的價值 - 而且,重要的是,如果您希望它成爲公式sigma或OBSERVABLE sigma。 –