3
votes

Générer des échantillons à partir de données suivant une distribution normale mais avec une nouvelle moyenne

J'ai un vecteur de nombres qui est

set.seed(1)
x <- rnorm(8334, 1.456977, 0.3552899)
mean(x)
[1] 1.454307

Essentiellement, je veux échantillonner au hasard 2000 nombres de x de sorte que la moyenne de cet échantillon soit inférieure.

/ p>

La clé est que je ne veux pas générer de nouveaux nombres aléatoires, mais seulement un échantillon de x , sans remplacement, de sorte que j'obtienne un sous-ensemble avec une moyenne différente.

Quelqu'un peut-il m'aider?

Merci!


6 commentaires

utilisez sample dans rnorm et sélectionnez une moyenne inférieure à la valeur que vous recherchez. TestVector = rnorm (8334, 1.456977, 0.3552899) rnorm (échantillon (TestVector, 8000), 0.5,0.3552899)


@JasonMathews comment cet échantillon d'un vecteur existant? Le code suivant renvoie FALSE . - set.seed (1); x <- rnorm (8334, 1.456977, 0.3552899); y <- rnorm (sample (x, 2000), 0.5,0.3552899); all (y% en% x) # [ 1] FAUX


Je pense que cela génère toujours des nombres au hasard. > table (TestVector% in% SampledVector) FALSE 8334 Existe-t-il un moyen d'échantillonner à partir du vecteur existant pour obtenir exactement les mêmes nombres?


Ma faute. J'aurais dû être plus prudent.


@naeum voulez-vous vraiment un sous-ensemble aléatoire de votre vecteur original ou un sous-ensemble fera-t-il l'affaire?


Salut Shree, oui. Je voudrais créer un sous-ensemble au hasard car je veux toujours une distribution normale. Le sous-ensemble conduit à une distribution non normale.


3 Réponses :


0
votes

randomiser la distribution normale pour l'exemple

mean(y)# ~0.9325603
sd(y)# ~0.5348885

choisir un échantillon de 2000 nombres

y= y*1.5

y moyen inférieur de 0,5

y=y-05

augmenter le sd de y de 1,5

y= sample(x,2000)

maintenant le sd et la moyenne de Y seront d'environ

x= rnorm(8334,1.45,0.355)

j'espère que c'est la réponse que vous cherchez


1 commentaires

Merci Shay. Je vais développer dans ma requête originale pourquoi je dois conserver les numéros d'origine. Votre approche me donne encore des chiffres différents à la fin.



2
votes

Cette méthode n'est pas vraiment "aléatoire" car elle ne sélectionne que des valeurs inférieures à mean (x) . Faites-moi savoir si cela vous convient -

z <- sample(x, 2000, prob = (x <= mean(x)) + 0.1)

mean(z)
[1] 1.225991

table(z <= mean(x))

FALSE  TRUE 
  202  1798

C'est effectivement la même chose que -

mean(sort(x)[1:2000])
[1] 0.9847526

De plus, pour 2000 valeurs, la moyenne la plus basse possible est la suivante -

z <- sample(x[x <= mean(x)], 2000)

all(z %in% x)
[1] TRUE

mean(z)
[1] 1.172033

MISE À JOUR -

Voici une façon d'obtenir échantillon aléatoire des deux côtés de mean (x) bien que ce soit arbitraire et je ne sais pas si cela garantirait une moyenne d'échantillon inférieure à mean (x) . -

set.seed(1)

x <- rnorm(8334, 1.456977, 0.3552899)

mean(x)
[1] 1.454307

y <- sample(x, 2000, prob = x <= mean(x)) # x > mean(x) has 0 chance of getting sampled

all(y %in% x)
[1] TRUE

mean(y)
[1] 1.170856


5 commentaires

Existe-t-il une meilleure alternative pour générer plusieurs combinaisons en utilisant la fonction combn et en vérifiant leur moyenne inférieure à la moyenne d'origine?


Je suppose qu'avec combn vous feriez essentiellement une recherche par force brute. Cela ne va pas bien évoluer.


Cela ressemble plus à un problème de nsum pour moi. cs.stackexchange.com/questions/2973/…


Merci @Shree! Je pense que c'est de loin le plus proche de ce que j'aimerais faire.


@naeum Voir la réponse mise à jour. Je pense toujours qu'il pourrait y avoir un meilleur moyen. En espérant que quelqu'un d'autre puisse répondre à cette question.



1
votes

Que diriez-vous de faire un échantillonnage de rejet, c'est-à-dire d'échantillonner 2000 nombres de votre vecteur jusqu'à ce que vous atteigniez un échantillon qui remplit les propriétés souhaitées?

set.seed(1)
x <- rnorm(8334, 1.456977, 0.3552899)
m_x <-mean(x)

y <- sample(x, 2000)
while(mean(y) >= m_x)
    y <- sample(x, 2000)

mean(y)
#> [1] 1.4477

Créé le 2019-06-18 par le package reprex (v0.3.0)

Cela devrait être assez rapide car il y a une chance (à peu près) égale que la nouvelle moyenne soit plus grande ou plus petite que l'ancienne.


1 commentaires

Merci @Ralf! Cela semble être le plus proche de ce que je recherche jusqu'à présent!