Voglio ... uh ... "attenuare" la straordinaria risposta di @ whuber, che @TomZinger dice è troppo difficile da seguire. Con questo voglio dire che voglio ridescriverlo in termini che penso che Tom Zinger capirà, perché è chiaramente la migliore risposta qui. E mentre Tom usa gradualmente il metodo e scopre che ha bisogno, diciamo, di conoscere la distribuzione dei campioni piuttosto che solo la loro media, la risposta di chiunque sarà proprio quello che sta cercando.
In breve: non ci sono idee originali qui, solo una spiegazione più semplice.
Desideri creare $ n $ numeri interi da $ 1 $ a $ 4 $ con media $ r $ . Suggerisco di calcolare $ n $ numeri interi da $ 0 $ a $ 3 $ con mean $ r-1 $ , quindi aggiungendone uno a ciascuno di essi. Se puoi fare quest'ultima cosa, puoi risolvere il primo problema. Ad esempio, se vogliamo 10 numeri interi compresi tra $ 1 $ e $ 4 $ con media $ 2,6 $ ,
possiamo annotare questi $ 10 $ interi tra $ 0 $ e $ 3 $ ...
0,3,2,1,3,1,2,1,3,0
la cui media è $ 1,6 $ ; se aumentiamo ciascuno di $ 1 $ , otteniamo
1,4,3,2,4,2,3,2,4,1
la cui media è $ 2,6 $ . È così semplice.
Ora pensiamo ai numeri da $ 0 $ a $ 3 $ . Li considererò come "quanti oggetti ho in un set" piccolo "?" Potrei non avere elementi, un elemento, due elementi o tre elementi. Quindi l'elenco
0,3,2,1,3,1,2,1,3,0
rappresenta dieci diversi piccoli set. Il primo è vuoto; il secondo ha tre elementi e così via. Il numero totale di elementi in tutti gli insiemi è la somma dei dieci numeri, ovvero $ 16 $ . E il numero medio di elementi in ogni set è questo totale, diviso per $ 10 $ , quindi $ 1,6 $ .
L'idea di chiunque sia questa: supponi di farti dieci piccoli set, con il numero totale di elementi $ 10t $ per un certo numero $ t $ . Quindi la dimensione media degli insiemi sarà esattamente $ t $ . Allo stesso modo, se imposti $ n $ set con un numero totale di elementi $ nt $ span >, il numero medio di elementi in un set sarà $ t $ . Dici di essere interessato al caso $ n = 100 $ .
Rendiamolo concreto per il tuo esempio: vuoi 100 elementi tra 1 e 4 la cui media è $ 1,9 $ . Usando l'idea del mio primo paragrafo, lo cambierò in "make $ 100 $ ints tra $ 0 $ span> e $ 3 $ la cui media è $ 0,9 $ ". Quando ho finito, aggiungerò $ 1 $ a ciascuno dei miei int per ottenere una soluzione al tuo problema. Quindi la mia media target è $ t = 0.9 $ .
Voglio creare set di $ 100 $ , ciascuno con un valore compreso tra $ 0 $ e $ 3 $ elementi in esso, con una dimensione media del set di $ 0,9 $ .
Come ho osservato sopra, ciò significa che deve esserci un totale di $ 100 \ cdot 0.9 = 90 $ elementi in i set. Dai numeri $ 1, 2, \ ldots, 300 $ , selezionerò esattamente $ 90 $ . Posso indicare quelli selezionati facendo un elenco di 300 punti e X:
..X .... X ... XX ...
dove l'elenco sopra indica che ho selezionato i numeri 3, 9, 13, 14 e poi molti altri che non ho mostrato perché mi sono stufato di digitare. :)
Posso prendere questa sequenza di 300 punti e X e suddividerla in tre gruppi di 100 punti ciascuno, che dispongo uno sopra l'altro, ottenendo qualcosa di simile a questo:
... X .... X..X ..... X ...
.X ... X ..... X ... X .....
..X ... X.X..X ...... X ..
ma continua per 100 articoli completi in ogni riga. Il numero di X in ogni riga potrebbe essere diverso: potrebbero esserci 35 nella prima riga, 24 nella seconda e 31 nella terza, ad esempio, e va bene. [Grazie a Whuber per aver sottolineato che avevo sbagliato in una prima bozza!]
Ora guarda ogni colonna : ogni colonna può essere considerata come un insieme e quell'insieme contiene da 0 a 3 "X". Posso scrivere i conteggi sotto le righe per ottenere qualcosa del genere:
... X .... X..X ..... X ...
.X ... X ..... X ... X .....
..X ... X.X..X ...... X ..
011101102003000101100
Vale a dire, ho prodotto 100 numeri, ciascuno compreso tra 1 e 3. E la somma di questi 100 numeri deve essere il numero di X, totale, in tutte e tre le righe, che era 90. Quindi la media deve essere $ 90/100 = 0,9 $ , come desiderato.
Ecco quindi i passaggi per ottenere 100 numeri interi compresi tra 1 e 4 la cui media è esattamente $ s $ .
- Lascia $ t = s - 1 $ .
- Calcola $ k = 100 t $ ; è il numero di X che inseriremo nelle righe, in totale.
- Crea un elenco di 300 punti o X, di cui $ k $ .
- Dividilo in tre righe di 100 punti o X, ciascuna contenente circa un terzo delle X, più o meno.
- Disporli in un array e calcolare le somme delle colonne, ottenendo 100 numeri interi compresi tra $ 0 $ e $ 3 $ span >. La loro media sarà $ t $ .
- Aggiungine uno a ogni somma di colonna per ottenere 100 numeri interi compresi tra $ 1 $ e $ 4 $ la cui media è $ s $ .
Ora la parte complicata di questo è proprio nel passaggio 4: come si selezionano $ 300 $ articoli, $ k $ di cui sono "X" e gli altri $ 300-k $ di cui sono "."? Bene, risulta che R ha una funzione che fa esattamente questo.
E poi whuber ti dice come usarlo: scrivi tu
tabulate (sample.int ((k-1) * n, s-n) %% n + 1, n)
Nel tuo caso particolare, $ n = 100 $ e $ s $ , il numero totale di elementi in tutti i piccoli insiemi, è $ 100r $ e desideri numeri compresi tra $ 1 $ e $ 4 $ , quindi $ k = 4 $ , quindi $ k -1 $ (la dimensione massima per un 'insieme piccolo') è 3, quindi diventa
tabulate (sample.int (3 * 100, 100r-100) %% 100 + 1, n)
o
tabulate (sample.int (3 * 100, 100 * (r-1)) %% 100 + 1, 100)
oppure, utilizzando il mio nome $ t $ per $ r - 1 $ , diventa
tabulate (sample.int (3 * 100, 100 * t) %% 100 + 1, 100)
Il "+1" alla fine della sua formula originale è esattamente il passaggio necessario per convertire da "numeri compresi tra $ 0 $ e $ 3 $ " a "numeri compresi tra $ 1 $ e $ 4 $ ".
Lavoriamo dall'interno verso l'esterno e semplifichiamo in $ n = 10 $ in modo da poter mostrare output di esempio:
tabulate (sample.int (3 * 10, 10 * t) %% 10 + 1, 10)
E miriamo a $ t = 1.9 $ , quindi questo diventa
tabulate (sample.int (3 * 10, 10 * 1.9) %% 10 + 1, 10)
A partire da sample.int (3 * 10, 10 * 1.9)
: questo produce un elenco di $ 19 $ interi compresi tra $ 1 $ e $ 30 $ . (cioè, ha risolto il problema di scegliere $ k $ numeri dal tuo totale - $ 300 $ in il tuo vero problema, $ 30 $ nel mio esempio più piccolo).
Come ricorderai, vogliamo produrre tre righe di dieci punti e X ciascuna, qualcosa come
X.X.XX.XX.
XXXX.XXX ..
XX.X.XXX ..
Possiamo leggere questo da sinistra a destra dall'alto verso il basso (cioè, normale ordine di lettura) per produrre un elenco di posizioni per X: il primo elemento è un punto; la seconda e la terza sono X e così via, quindi il nostro elenco di posizioni inizia con $ 1, 3, 5, 6, \ ldots $ . Quando arriviamo alla fine di una riga, continuiamo a contare, quindi per l'immagine sopra, le posizioni X sarebbero $ 1, 3, 5, 6, 8, 9, 11, 12, 13, 14, 16, 17, 18, 21, 22, 24, 26, 27, 28 $ . È chiaro?
Ebbene, il codice Whubers produce esattamente quell'elenco di posizioni con la sua sezione più interna.
L'elemento successivo è %% 10
; che prende un numero e produce il suo resto sulla divisione per dieci. Quindi il nostro elenco diventa $ 1, 3, 5, 6, 8, 9, 1, 2, 3, 4, 6, 7, 8, 1, 2, 4, 6, 7, 8 $ . Se lo suddividiamo in tre gruppi --- quelli che provengono da numeri compresi tra $ 1 $ e $ 10 $ , quelli che provenivano da numeri da $ 11 $ a $ 20 $ e quelli che provenivano da numeri $ 21 $ a $ 30 $ , otteniamo $ 1, 3, 5, 6, 8, 9 $ , quindi $ 1, 2, 3, 4, 6, 7, 8, $ e infine $ 1, 2, 4, 6, 7, 8 $ . Quelli ti dicono dove sono le X in ciascuna delle tre righe. C'è un sottile problema qui: se ci fosse stata una X nella posizione 10 nella prima riga, il primo dei nostri tre elenchi sarebbe stato $ 1, 3, 5, 6, 8, 9 , 0 $ e alla funzione tabulate
non piace "0". Quindi whuber aggiunge 1 a ogni elemento nell'elenco per ottenere $ 2, 4, 6, 7, 9, 10, 1 $ . Passiamo al calcolo complessivo:
tabulate (sample.int (3 * 10, 10 * 1.9) %% 10 + 1, 10)
Questo richiede "quei numeri $ 30 $ , ciascuno che indica se c'è una X in una colonna, dimmi quante volte ogni colonna (da $ 1 $ a $ 10 $ --- questo è quello che ti dice il" 10 "finale) appare, cioè dimmi quante X sono in ogni colonna. Il risultato è
0 3 2 2 2 1 3 2 3 1
che (a causa dello spostamento di una cosa) devi leggere come "non ci sono X nella decima colonna; ci sono 3 X nella prima colonna; ci sono 2 X nella seconda colonna" e così via su a "c'è una X nella nona colonna".
Ciò fornisce dieci numeri interi compresi tra $ 0 $ e $ 3 $ la cui somma è $ 19 $ , quindi la cui media è $ 1,9 $ . Se aumenti ciascuno di 1, ottieni dieci numeri interi compresi tra $ 1 $ e $ 4 $ la cui somma è $ 29 $ , quindi un valore medio di $ 2,9 $ .
Puoi generalizzare a $ n = 100 $ , spero.