Minun on luotava satunnaislukuja normaalijakauman mukaisesti aikavälillä $ (a, b) $. (Työskentelen R.: ssä.)

Tiedän, että funktio rnorm(n,mean,sd) tuottaa satunnaislukuja normaalijakauman jälkeen, mutta miten asetetaan aikavälirajat sen sisällä? Onko sille käytettävissä tiettyjä R-toimintoja?

Kommentit

  • Miksi haluat tehdä tämän? Jos se ’ on rajoitettu, se ei voi ’ olla todella normaalia. Mitä yrität saavuttaa?
  • x <- rnorm(n, mean, sd); x <- x[x > lower.limit & x < upper.limit]
  • @Hugh että ’ on hienoa … niin kauan kuin et ’ välitä, kuinka monta satunnaisarvoa saat.

Vastaa

Kuulostaa siltä, että haluat simuloida katkaistusta jakelusta ja omassa esimerkissäsi , a katkaistu normaali .

Tätä varten on olemassa useita menetelmiä, jotkut yksinkertaisia, toiset suhteellisen tehokas.

Kuvaan joitain lähestymistapoja tavallisessa esimerkissäsi.

  1. Tässä on yksi hyvin yksinkertainen tapa luoda yksi kerrallaan (jonkinlaisessa pseudokoodissa) ):

    $ \ tt {repeat} $ generoi $ x_i $ kohteesta N (keskiarvo, sd) $ \ tt {kunnes} $ lower $ \ leq x_i \ leq $ upper

    kirjoita kuvan kuvaus tähän

    Jos suurin osa jakelusta on rajojen sisällä, tämä on melko kohtuullista, mutta se voi hidastua, jos Tuotat melkein aina rajojen ulkopuolella.

    R: ssä voit välttää yksi kerrallaan -silmukan laskemalla alueen rajat ja luomalla tarpeeksi arvoja, joista voit olla melkein varma, kun heität ulos rajojen ulkopuolella olevilla arvoilla oli vielä niin monta arvoa kuin tarvitaan.

  2. Voit käyttää hyväksyntä-hylkäys -toimintoa jollakin sopivalla majorisointitoiminnolla aikavälillä (joissakin tapauksissa yhtenäinen ole tarpeeksi hyvä). Jos rajat olivat kohtuullisen kapeat suhteessa s.d. mutta et ole kaukana hännästä, yhtenäinen päällikkö toimii esimerkiksi normaalin kanssa.

    kirjoita kuvan kuvaus tähän

  3. Jos sinulla on kohtuullisen tehokas cdf ja käänteinen cdf (kuten pnorm ja qnorm normaalijakauma R: ssä) voit käyttää käänteistä cdf-menetelmää, joka on kuvattu Wikipedia-sivun simuloidun osan ensimmäisessä kappaleessa katkaistussa normaalissa . [Voimassa tämä on sama asia kuin katkaistun univormun ottaminen (katkaistuna vaadittuihin kvantiileihin, mikä ei todellakaan vaadi hylkäyksiä ollenkaan, koska se on vain toinen univormu) ja käytä siihen käänteistä normaalia cdf-tiedostoa. Huomaa, että tämä voi epäonnistua, jos olet kaukana hännässä.

    kirjoita kuvan kuvaus tähän

  4. On olemassa muita lähestymistapoja; samalla Wikipedia-sivulla mainitaan ziggurat -menetelmän mukauttaminen, jonka pitäisi toimia useilla jakeluilla.

samassa Wikipedia-linkissä mainitaan kaksi erityistä pakettia (molemmat CRAN-versiossa), joiden toiminnot katkaistujen normaalien luomiseen:

R-ryhmän MSM -paketilla on funktio rtnorm, joka laskee piirustukset katkaistusta normaali. R: n truncnorm -paketilla on myös toimintoja, joita voidaan piirtää katkaistusta normaalista.


Katse ympärillesi, paljon tästä on käsitelty vastauksissa muihin kysymyksiin (mutta ei tarkalleen kaksoiskappaleita, koska tämä kysymys on yleisempi kuin vain katkaistu normaali) … katso lisäkeskustelu osiossa

a. Tämä vastaus

b. Xi ”an” s vastaa täällä , jolla on linkki hänen arXiv-artikkeliinsa (yhdessä muiden arvokkaiden vastausten kanssa).

Vastaa

Nopea ja likainen lähestymistapa on käyttää 68-95-99.7 -sääntöä .

Normaalijakaumassa 99,7% arvoista kuuluu kolmen keskihajonnan keskiarvoon. Joten jos asetat keskiarvosi keskiarvoksi halutun vähimmäisarvon ja maksimiarvon ja asetat keskihajonnan 1/3 keskiarvosta, saat (enimmäkseen) arvot, jotka kuuluvat haluttuun väliin. Sitten voit vain siivota loput.

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) 

Kohtasin äskettäin saman ongelman yrittäessäni luoda satunnaiset opiskelijoiden arvosanat testitiedoille. Yllä olevassa koodissa olen käyttänyt pmax ja pmin korvaamaan rajojen ulkopuoliset arvot raja-arvoilla min tai max arvo.Tämä toimii tarkoitukselleni, koska tuotan melko pieniä määriä dataa, mutta suuremmille määrille se antaa sinulle huomattavia kuoppia min- ja max-arvoilla. Joten tarkoituksistasi riippuen saattaa olla parempi hylätä nämä arvot, korvata ne NA s: n kanssa tai ”vieritä” heitä, kunnes ne ovat uudelleen rajojen sisällä.

Kommentit

  • Miksi vaivautua tekemään tätä? Normaalien satunnaislukujen luominen ja katkaisemista tarvitsevien poistaminen on niin helppoa, että sen ei tarvitse olla monimutkaista, ellei haluttu katkaisu ole lähellä 100% pinta-alasta. tiheydestä.
  • Ehkä tulkitsen alkuperäistä kysymystä väärin ’. Törmäsin tähän kysymykseen yrittäessäni selvittää, miten saavuttaa ei-suoraan-tilastoihin liittyvä ohjelmointitehtävä R: ssä, ja olen ’ huomannut vasta nyt, että tämä sivu on tilastopino , ei ohjelmointipinonvaihtoa. 🙂 Minun tapauksessani halusin luoda tietyn määrän satunnaisia kokonaislukuja, joiden arvot vaihtelevat välillä 0-100, ja halusin, että luodut arvot putoavat mukavalle kellokäyrälle tällä alueella. Tämän kirjoittamisen jälkeen olen ’ huomannut, että sample(x=min:max, prob=dnorm(...)) on ehkä helpompi tapa tehdä se.
  • @Glen_b Aaron Wells mainitsee sample(x=min:max, prob=dnorm(...)), joka vaikuttaa hieman lyhyemmältä kuin vastauksesi.
  • Huomaa kuitenkin, että sample() -temppu on vain hyödyllinen jos ’ yrität valita satunnaisia kokonaislukuja tai muita erillisiä, ennalta määriteltyjä arvoja.

Vastaa

Mikään tässä annetuista vastauksista ei anna tehokasta menetelmää katkaistujen normaalimuuttujien luomiseen, mikä ei sisällä mielivaltaisesti suurten muutosten hylkäämistä luotujen arvojen lukumäärä. Jos haluat luoda arvoja katkaistusta normaalijakaumasta määritetyillä ala- ja ylärajoilla $ a < b $ , tämä voidaan tehdä — ilman hylkäämistä — luomalla yhtenäiset kvantiilit katkaisun sallimalla kvantiilialueella ja käyttämällä käänteismuunnosnäytteistystä vastaavien normaaliarvojen saamiseksi .

Merkitään $ \ Phi $ normaalin normaalijakauman CDF: ää. Haluamme luoda $ X_1, …, X_N $ katkaistusta normaalijakaumasta (keskimääräisellä parametrilla $ \ mu $ ja varianssiparametri $ \ sigma ^ 2 $ ) $ ^ \ dagger $ alemmalla ja ylemmät katkaisurajat $ a < b $ . Tämä voidaan tehdä seuraavasti:

$$ 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]. $$

Katkaistusta jakelusta generoiduille arvoille ei ole sisäänrakennettua toimintoa, mutta on triviaalia ohjelmoida tämä menetelmä tavalliset toiminnot satunnaismuuttujien muodostamiseksi. Tässä on yksinkertainen R -funktio rtruncnorm, joka toteuttaa tämän menetelmän muutamassa koodirivissä.

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); } 

Tämä on vektoroitu funktio, joka tuottaa N IID-satunnaismuuttujat katkaistusta normaalijakaumasta. Olisi helppo ohjelmoida toimintoja muille katkaistulle jakelulle samalla menetelmällä. Ei myöskään ole liian vaikeaa ohjelmoida liitettyjä tiheys- ja kvantiilitoimintoja katkaistulle jakelulle.


$ ^ \ dagger $ Huomaa, että katkaisu muuttaa jakauman keskiarvoa ja varianssia, joten $ \ mu $ ja $ \ sigma ^ 2 $ eivät ole katkaistun jakauman keskiarvo ja varianssi.

Vastaa

Kolme tapaa on toiminut minulle:

  1. käyttämällä näytettä () ja rnorm ():

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

  2. msm-paketin ja rtnorm-funktion avulla:

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

  3. käyttämällä rnorm () ja määrittelemällä ala- ja ylärajat, kuten Hugh on kirjoittanut yllä:

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *