Come generare una sequenza con media ?


11

So come generare una sequenza con media . Ad esempio, in Matlab, se voglio generare una sequenza di lunghezza , è:0 ± 1 10000±10±110000

2*(rand(1, 10000, 1)<=.5)-1

Tuttavia, come generare una sequenza con media , ovvero con leggermente preferito?±110.051

Risposte:


18

La tua media desiderata è data dall'equazione:

NpN(1p)N=.05

da cui segue che 1sdovrebbe essere la probabilità di.525

In Python:

x = np.random.choice([-1,1], size=int(1e6), replace = True, p = [.475, .525])

Prova:

x.mean()
0.050742000000000002

1'000 esperimenti con 1'000'000 campioni di 1s e -1s: inserisci qui la descrizione dell'immagine

Per completezza (punta del cappello a @Elvis):

import scipy.stats as st
x = 2*st.binom(1, .525).rvs(1000000) - 1
x.mean()
0.053859999999999998

1'000 esperimenti con 1'000'000 campioni di 1s e -1s:

inserisci qui la descrizione dell'immagine

E infine attingendo da una distribuzione uniforme, come suggerito da @ Łukasz Deryło (anche, in Python):

u = st.uniform(0,1).rvs(1000000)
x = 2*(u<.525) -1
x.mean()
0.049585999999999998

1'000 esperimenti con 1'000'000 campioni di 1s e -1s:

inserisci qui la descrizione dell'immagine

Tutti e tre sembrano praticamente identici!

MODIFICARE

Coppia di righe sul teorema del limite centrale e diffusione delle distribuzioni risultanti.

Prima di tutto, i disegni di mezzi seguono effettivamente la distribuzione normale.

In secondo luogo, @Elvis nel suo commento a questa risposta ha fatto alcuni bei calcoli sull'esatta diffusione dei mezzi tracciati su 1'000 esperimenti (circa (0,048; 0,052)), intervallo di confidenza al 95%.

E questi sono i risultati delle simulazioni, per confermare i suoi risultati:

mn = []
for _ in range(1000):
    mn.append((2*st.binom(1, .525).rvs(1000000) - 1).mean())
np.percentile(mn, [2.5,97.5])
array([ 0.0480773,  0.0518703])

Bel lavoro. Il mio punto con i Bernoulli era di ridurre la domanda a una distribuzione di probabilità ben nota; dal punto di vista dell '"implementazione", la tua risposta e Łukasz sono state perfette.
Elvis,

Non scherzo, il tuo è il più scientifico e il migliore! ;) Stavo pensando alla distribuzione binomiale per mezzo secondo, ma non era abbastanza per trasformarla in -1 e 1, quindi ho preso in prestito la tua soluzione "così com'è", grazie!
Sergey Bushmanov,

1
Quindi, con le mie notazioni, e la deviazione standard di è . Quando si prende la media su campioni, la deviazione standard è e il 95% delle medie calcolate dovrebbe essere nell'intervallo , ovvero . Math check out! ;)Y 0.999 10 6 0.999 × 10 - 3 0,05 ± 1,96 × 0,999 × 10 - 3 ( 0,048 ; 0,052 )var(Y)=4var(X)=4p(1p)=0.9975Y0.9991060.999×1030.05±1.96×0.999×103(0.048;0.052)
Elvis,

12

Una variabile con valori e la forma con a Bernoulli con parametro . Il suo valore atteso è , quindi sai come ottenere (qui ).1 Y = 2 X - 1 X p E ( Y ) = 2 E ( X ) - 1 = 2 p - 111Y=2X1XpE(Y)=2E(X)-1=2p-1p = 0,525pp=0.525

In R puoi generare variabili di Bernoulli con rbinom(n, size = 1, prob = p), quindi ad esempio

x <- rbinom(100, 1, 0.525)
y <- 2*x-1

5

Generare campioni in modo uniforme da , ricodificare numeri inferiori a 0,525 a 1 e riposare a -1.[ 0 , 1 ]N[0,1]

Quindi il tuo valore atteso è

10.525+(-1)(1-0.525)=0.525-0,475=0.05

Non sono un utente Matlab, ma immagino che lo sia

2*(rand(1, 10000, 1)<=.525)-1

3
Questo è un modo corretto di impiegare il campionamento di trasformazioni inverse qui.
Tim

4

Devi generare più 1s che -1s. Precisamente, il 5% in più di 1 secondo perché vuoi che la tua media sia 0,05. Quindi, aumenti la probabilità di 1 secondo del 2,5% e diminuisci di -1 secondi del 2,5%. Nel codice è equivalente a cambiare 0.5a 0.525, vale a dire dal 50% al 52,5%


2

Nel caso in cui desideri un EXACT 0.05 significa che puoi fare l'equivalente del seguente codice R in MATLAB:

sample(c(rep(-1, 95*50), rep(1, 105*50)))

-1 questa risposta è sbagliata! L'unica cosa che fa questo codice è che permette casualmente il vettore statico di valori. L'output non è casuale!
Tim

2
@Tim Perché non funziona? Restituisce un elenco di -1 e 1 in un ordine casuale con conteggi progettati per garantire una media esatta di 0,05.
ddunn801,

1
@Tim Questa soluzione è casuale. Hai provato a eseguirlo ripetutamente?
whuber

@whuber è la stessa soluzione suggerita da Amos Coats, l'unica differenza è permutazione dei valori. Le proprietà statistiche di tale campione saranno deterministiche e costanti.
Tim

3
@Tim Penso che potresti leggere alcune assunzioni ingiustificate in questa domanda che non sono esplicitamente fatte. Sebbene le frequenze - e quindi tutti i momenti - del campione non ordinato stesso saranno costanti, una grande varietà di "proprietà statistiche" della serie che viene generata varierà casualmente. Poiché l'esempio nella domanda genera una matrice e le matrici non sono insiemi - ordina le cose in una matrice - penso che questa interpretazione sia giusta (e illumina la domanda). La "soluzione" pubblicata da Coats, d'altra parte, è una buona battuta, ma a SE non piace scherzare.
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.