Comment générer une séquence

11

Je sais comment générer une séquence avec une moyenne de . Par exemple, dans Matlab, si je veux générer une séquence de longueur , c'est:0 ± 1 10000±10±110000

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

Cependant, comment générer une séquence avec une moyenne de , c'est-à-dire avec étant légèrement préféré?0,05 1±10.051

Ka-Wa Yip
la source

Réponses:

18

Votre moyenne souhaitée est donnée par l'équation:

NpN(1p)N=.05

à partir de laquelle résulte que la probabilité de 1sdevrait être.525

En Python:

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

Preuve:

x.mean()
0.050742000000000002

1'000 expériences avec 1'000'000 échantillons de 1 et -1: entrez la description de l'image ici

Par souci d'exhaustivité (pointe du chapeau à @Elvis):

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

1'000 expériences avec 1'000'000 échantillons de 1 et -1:

entrez la description de l'image ici

Et enfin, à partir d'une distribution uniforme, comme suggéré par @ Łukasz Deryło (également en Python):

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

1'000 expériences avec 1'000'000 échantillons de 1 et -1:

entrez la description de l'image ici

Tous les trois semblent pratiquement identiques!

ÉDITER

Couple de droites sur le théorème de la limite centrale et la propagation des distributions résultantes.

Tout d'abord, les tirages de moyens suivent en effet la distribution normale.

Deuxièmement, @Elvis dans son commentaire à cette réponse a fait de bons calculs sur la répartition exacte des moyennes tirées sur 1'000 expériences (environ (0,048; 0,052)), intervalle de confiance à 95%.

Et ce sont les résultats des simulations, pour confirmer ses résultats:

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])
Sergey Bushmanov
la source
Bon travail. Mon point avec le Bernoulli était de réduire la question à une distribution de probabilité bien connue; du point de vue de la «mise en œuvre», votre réponse et Łukasz »étaient parfaites.
Elvis
Sans blague, la vôtre est la plus scientifique et la meilleure! ;) Je pensais à la distribution binomiale pendant une demi-seconde mais ce n'était pas suffisant pour la transformer en -1 et en 1, alors j'ai emprunté votre solution "en l'état", merci!
Sergey Bushmanov
1
Donc avec mes notations, , et l'écart-type de est . Lorsque vous prenez la moyenne sur échantillons, l'écart-type est de et 95% des moyennes calculées doivent être dans l'intervalle , c'est-à-dire . Math check out! ;)var(Y)=4var(X)=4p(1p)=0.9975Y0.9991060.999×1030.05±1.96×0.999×103(0.048;0.052)
Elvis
12

Une variable avec les valeurs et est de la forme avec a Bernoulli avec le paramètre . Sa valeur attendue est , vous savez donc comment obtenir (ici ).11Y=2X1XpE(Y)=2E(X)1=2p1pp=0.525

Dans R, vous pouvez générer des variables Bernoulli avec rbinom(n, size = 1, prob = p), par exemple

x <- rbinom(100, 1, 0.525)
y <- 2*x-1
Elvis
la source
5

Générez échantillons uniformément à partir de , recodez des nombres inférieurs à 0,525 à 1 et reposez à -1.N[0,1]

Alors votre valeur attendue est

10.525+(1)(10.525)=0.5250.475=0.05

Je ne suis pas un utilisateur de Matlab, mais je suppose que ça devrait être

2*(rand(1, 10000, 1)<=.525)-1
Łukasz Deryło
la source
3
C'est une façon correcte d'utiliser l' échantillonnage par transformée inverse ici.
Tim
4

Vous devez générer plus de 1 que de -1. Précisément, 5% de 1 de plus parce que vous voulez que votre moyenne soit de 0,05. Ainsi, vous augmentez la probabilité de 1s de 2,5% et diminuez -1s de 2,5%. Dans votre code, cela équivaut à passer 0.5à 0.525, c'est- à -dire de 50% à 52,5%

Aksakal
la source
2

Au cas où vous voudriez un EXACT 0,05, vous pouvez faire l'équivalent du code R suivant dans MATLAB:

sample(c(rep(-1, 95*50), rep(1, 105*50)))
ddunn801
la source
-1 cette réponse est fausse! La seule chose que ce code fait, c'est qu'il permute au hasard le vecteur statique de valeurs. La sortie n'est pas aléatoire!
Tim
2
@Tim Pourquoi ça ne marche pas? Il renvoie une liste de -1 et 1 dans un ordre aléatoire avec des comptages conçus pour assurer une moyenne exacte de 0,05.
ddunn801
1
@Tim Cette solution est aléatoire. Avez-vous essayé de l'exécuter à plusieurs reprises?
whuber
@quand ceci est identique à la solution suggérée par Amos Coats, la seule différence est la permutation des valeurs. Les propriétés statistiques d'un tel échantillon seront déterministes et constantes.
Tim
3
@Tim Je pense que vous lisez dans cette question des hypothèses injustifiées qui ne sont pas explicitement formulées. Bien que les fréquences - et donc tous les moments - de l' échantillon non ordonné lui-même soient constantes, une grande variété de "propriétés statistiques" de la série générée variera de manière aléatoire. Étant donné que l'exemple de la question génère un tableau et que les tableaux ne sont pas des ensembles - l'ordre est important dans un tableau - je pense que cette interprétation est juste (et elle éclaire la question). La «solution» publiée par Coats, d'autre part, est une bonne blague - mais SE n'aime pas plaisanter.
whuber