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!
3 Réponses :
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
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.
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
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.
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.
Merci @Ralf! Cela semble être le plus proche de ce que je recherche jusqu'à présent!
utilisez
sample
dansrnorm
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.