Véletlenszerű számokat kell generálnom a $ (a, b) $ intervallumon belüli Normál eloszlás alapján. (R-ben dolgozom.)

Tudom, hogy a rnorm(n,mean,sd) függvény véletlenszerű számokat generál a normál eloszlás nyomán, de hogyan lehet ezen belül beállítani az intervallumkorlátokat? Van-e ehhez külön R funkció?

Megjegyzések

  • Miért akarja ezt megtenni? Ha ‘ korlátozódik, akkor ‘ nem lehet normális. Mit próbál elérni?
  • x <- rnorm(n, mean, sd); x <- x[x > lower.limit & x < upper.limit]
  • @Hugh, hogy ‘ nagyszerű … mindaddig, amíg nem ‘ nem érdekli, hogy hány véletlenszerű értéket kap.

Válasz

Úgy hangzik, mintha egy csonka terjesztésből és a konkrét példában szeretne szimulálni , a csonka normál .

Erre számos módszer létezik, némelyik egyszerű, némelyik viszonylag hatékony.

Néhány megközelítést bemutatok a szokásos példáján.

  1. Itt egy nagyon egyszerű módszer az egyesek előállítására (valamilyen álkódban) ):

    $ \ tt {repeat} $ generál $ x_i $ N-ből (jelentése: sd) $ \ tt {ig} $ alsó $ \ leq x_i \ leq $ felső

    írja ide a kép leírását

    Ha a terjesztés nagy része a határokon belül van, ez elég ésszerű, de meglehetősen lassú lehet, ha szinte mindig a határokon kívül generál.

    R-ben elkerülheti az egy az egyben ciklust azáltal, hogy kiszámítja a határokon belüli területet, és elegendő értéket generál, amiben szinte biztos lehet benne, hogy kidobás után a határokon kívüli értékek még mindig annyi értéket tartalmaztak, amennyi szükséges volt.

  2. Használhatja az elfogadás-elutasítást, megfelelő intervallumon belül (megfelelő esetekben az egységes legyen elég jó). Ha a határok ésszerű mértékben szűkek lennének az s.d. de nem voltál messze a farokban, az egységes szakosodás rendben működne például a normálnál.

    ide írja be a kép leírását

  3. Ha van egy ésszerűen hatékony cdf és inverz cdf fájl (például pnorm és qnorm a normális eloszlás R-ben) használhatja az inverse-cdf módszert, amelyet a Wikipedia oldal csonka normálon szimulációs szakaszának első bekezdésében leírtak. [Gyakorlatilag ez megegyezik egy csonka egyenruha felvételével (amely a szükséges kvantilisoknál csonkolva van, ami valójában egyáltalán nem igényel elutasítást, mivel ez csak egy újabb egyenruha), és erre alkalmazza az inverz normál cdf-t. Vegye figyelembe, hogy ez meghiúsulhat, ha messze van a faroknál.

    ide írja a kép leírását

  4. Vannak más megközelítések is; ugyanaz a Wikipedia oldal megemlíti a ziggurat módszer adaptálását, amelynek sokféle disztribúció esetén működnie kell.

Az ugyanaz a Wikipedia link két speciális csomagot említ (mindkettőt a CRAN-on), amelyeknek funkciói vannak a csonka normálok előállításához:

Az R csoportban található MSM csomagnak van egy funkciója, a rtnorm, amely csonkolt nyereményeket számol normális. Az R truncnorm csomagnak olyan funkciói is vannak, amelyeket csonka normálból lehet levonni.


Körülnézve, sok mindenről más kérdésekre adott válaszok foglalkoznak (de nem pontosan duplikátumok, mivel ez a kérdés általánosabb, mint pusztán a csonka normál) … további vitát lásd a

a. Ez a válasz

b. Xi “an” s válasz itt , amely egy linket mutat az arXiv cikkéhez (néhány más hasznos válaszsal együtt).

Válasz

A gyors és piszkos megközelítés a 68-95-99.7 szabály használatát jelenti .

Normál eloszlás esetén az értékek 99,7% -a az átlag 3 szórásán belül esik. Tehát, ha az átlagot a kívánt minimális és maximális érték közepére állítja, és a szórását az átlagának 1/3-ra állítja, akkor (többnyire) olyan értékeket kap, amelyek a kívánt intervallumba esnek. Ezután csak megtisztíthatja a többit.

minVal <- 0 maxVal <- 100 mn <- (maxVal - minVal)/2 # Generate numbers (mostly) from min to max x <- rnorm(count, mean = mn, sd = mn/3) # Do something about the out-of-bounds generated values x <- pmax(minVal, x) x <- pmin(maxVal, x) 

Nemrégiben ugyanezzel a problémával szembesültem, és megpróbáltam generálni a véletlenszerű hallgatói osztályzatok a tesztadatokhoz. A fenti kódban pmax és pmin értékeket használtam a határon kívüli értékek helyettesítésére a minimum vagy a maximális határon belül érték.Ez az én célomra működik, mert meglehetősen kis mennyiségű adatot állítok elő, de nagyobb mennyiségeknél észrevehető ütéseket eredményez a min és a max értékeknél. Tehát céljától függően jobb lehet ezeket az értékeket elvetni, kicserélni NA s elemekkel, vagy addig „tekerje át őket”, amíg újra be nem lépnek.

Megjegyzések

  • Miért bajlódni ezzel? Olyan egyszerű a normál véletlenszerű számok előállítása és a csonkolásra szoruló számok eldobása, hogy nem kell ‘ ezt bonyolítani, hacsak a kívánt csonkítás nem közelíti meg a terület 100% -át sűrűségét.
  • Talán ‘ rosszul értelmezem az eredeti kérdést. Ezzel a kérdéssel találkoztam, miközben megpróbáltam kitalálni, hogyan lehet elérni egy nem közvetlenül a statisztikákkal kapcsolatos programozási feladatot az R-ben, és ‘ csak most vettem észre, hogy ez az oldal egy statisztikai veremcsere , nem egy programozási stackcsere. 🙂 Esetemben egy meghatározott mennyiségű véletlenszerű egész számot akartam létrehozni, 0 és 100 közötti értékekkel, és azt akartam, hogy a létrehozott értékek egy szép haranggörbére esjenek ezen a tartományon keresztül. Ennek megírása óta ‘ rájöttem, hogy a sample(x=min:max, prob=dnorm(...)) talán könnyebb módszer erre.
  • @Glen_b Aaron Wells megemlíti a sample(x=min:max, prob=dnorm(...)) szót, amely valamivel rövidebbnek tűnik, mint a válaszod.
  • De vegye figyelembe, hogy a sample() trükk csak hasznos ha ‘ véletlenszerű egész számokat vagy más diszkrét, előre definiált értékeket próbál felvenni.

Válasz

Az itt felsorolt válaszok egyike sem ad hatékony módszert csonka normál változók előállítására, amely nem jár önkényesen nagy értékek elutasításával generált értékek száma. Ha csonka normál eloszlásból szeretne értékeket generálni, meghatározott alsó és felső határokkal $ a < b $ , akkor — elutasítás nélkül — megtehető azáltal, hogy egyenletes kvantilokat állítunk elő a csonkolás által megengedett kvantilis tartományban, és a inverz transzformációs mintavétel segítségével megkapjuk a megfelelő normál értékeket .

Jelölje $ \ Phi $ a normál normál eloszlás CDF-jét. $ X_1, …, X_N $ egy csonka normál eloszlásból szeretnénk előállítani ( $ \ mu $ átlagos paraméterrel és variancia paraméter $ \ sigma ^ 2 $ ) $ ^ \ dagger $ alacsonyabb és felső csonkítási határok $ a < b $ . Ez a következőképpen tehető meg:

$$ X_i = \ mu + \ sigma \ cdot \ Phi ^ {- 1} (U_i) \ quad \ quad \ quad U_1, …, U_N \ sim \ text {IID U} \ Big [\ Phi \ Big (\ frac {a- \ mu} {\ sigma} \ Big), \ Phi \ Big (\ frac {b- \ mu} {\ sigma} \ Big) \ Big]. $$

A csonka terjesztésből generált értékek számára nincs beépített függvény, de triviális ezt a módszert a rendes függvények véletlenszerű változók előállításához. Itt van egy egyszerű R függvény rtruncnorm, amely ezt a módszert néhány kódsorban valósítja meg.

rtruncnorm <- function(N, mean = 0, sd = 1, a = -Inf, b = Inf) { if (a > b) stop("Error: Truncation range is empty"); U <- runif(N, pnorm(a, mean, sd), pnorm(b, mean, sd)); qnorm(U, mean, sd); } 

Ez egy vektorizált függvény, amely N IID véletlen változót generál a csonka normál eloszlásból. Könnyű lenne ugyanolyan módszerrel más csonka elosztásokhoz programozni a függvényeket. Nem lenne túl nehéz társított sűrűség- és kvantilisfüggvényeket programozni a csonka eloszláshoz.


$ ^ \ dagger $ Vegye figyelembe, hogy a csonkolás megváltoztatja az eloszlás átlagát és szórását, így $ \ mu $ és $ \ sigma ^ 2 $ nem nem a csonka eloszlás átlaga és szórása.

Válasz

Három módszer működött nálam:

  1. a minta () használata rnorm () -vel:

    sample(x=min:max, replace= TRUE, rnorm(n, mean))

  2. az msm csomag és az rtnorm függvény használatával:

    rtnorm(n, mean, lower=min, upper=max)

  3. az rnorm () használatával és az alsó és felső határ megadásával, ahogy Hugh fentebb közzétette:

    sample <- rnorm(n, mean=mean); sample <- sample[x > min & x < max]

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük