Pytanie:
Jak wygenerować losowe liczby całkowite od 1 do 4, które mają określoną średnią?
Fierce82
2020-01-06 04:34:06 UTC
view on stackexchange narkive permalink

Muszę wygenerować 100 losowych liczb całkowitych w R , gdzie każda liczba całkowita mieści się w przedziale od 1 do 4 (stąd 1,2,3,4), a średnia jest równa określonej wartości.

Jeśli narysuję losowe liczby jednolite od 1 do 5 i otrzymam floor , mam średnią 2,5.

  x = floor (runif (100, min = 1, max = 5))
 

Muszę poprawić średnią na przykład na 1,9 lub 2,93.

Wydaje mi się, że mogę wygenerować losowe liczby całkowite, które dodają się do 100 * średniej, ale nie wiem, jak ograniczyć do losowych liczb całkowitych od 1 do 4

Czy muszą być niezależni?
nie jestem pewien, czy odpowiedź brzmi tak, czy nie, jeśli pomyślisz o czymkolwiek, myślę, że to wystarczy, pod warunkiem, że spełniają moje ograniczenia, liczby całkowite od 1 do 4 i ustaloną średnią.
Myślę, że jest to trochę niedookreślone ... Na przykład można uzyskać średnią 1,9 z `próbka (rozmiar = n, x = 1: 4, prob = c (3.666,1,1,1), zastąp =TRUE) `, ale także z` sample (size = n, x = 1: 4, prob = c (3,1,1,0.715), replace = TRUE) `.
Czy zastanawiasz się, jak ograniczyć średnią podstawowego rozkładu lub średnią próbki?
próbka oznacza @user20160
Liczby całkowite od 1 do 4 pozwalają tylko na 2 i 3. Musisz również określić rozkład, z którego są losowane (lub wymieszać).
Głosowałem za pozostawieniem tego * otwartego *, ponieważ jest tutaj interesujące pytanie algorytmiczne - część R jest przypadkowa;równie łatwo można to zaimplementować w Pythonie lub za pomocą pada i kilku kostek.
`floor (runif (100, min = 1, max = 5))` jest po prostu zaciemnionym sposobem wykonania `sample (1: 4, ...)` z domyślnymi prawdopodobieństwami `... prob = rep (0,25,4) ".Chcesz próbkę (1: 4, prob) z niejednolitymi prawdopodobieństwami.To jest niewystarczające, czy masz jakieś inne ograniczenia?Czy obchodzi cię stdev?Czy chcesz, aby dystrybucja była jak najbardziej zbliżona do normy?
Siedem odpowiedzi:
whuber
2020-01-06 22:46:03 UTC
view on stackexchange narkive permalink

Zgadzam się z X'ian, że problem jest niedostatecznie określony. Istnieje jednak eleganckie, skalowalne, wydajne, efektywne i wszechstronne rozwiązanie, które warto rozważyć.

Ponieważ iloczyn średniej i wielkości próby jest równy sumie próby, problem dotyczy wygenerowania losowej próbki $ n $ wartości w zbiorze $ \ {1,2, \ ldots, k \} $ to suma $ s $ (zakładając $ n \ le s \ le kn, $ oczywiście).

Aby wyjaśnić proponowane rozwiązanie i, mam nadzieję, uzasadnić twierdzenie elegance, , przedstawiam graficzną interpretację tego schematu próbkowania. Ułóż siatkę $ k $ wierszy i $ n $ kolumn. Zaznacz każdą komórkę w pierwszym rzędzie. Losowo (i jednolicie) wybierz $ sn $ z pozostałych komórek w wierszach od $ 2 $ do $ k. $ Wartość obserwacji $ i $ w próbce to liczba komórek wybranych w kolumnie $ i: $

Figure

Siatka 4 $ \ times 100 $ jest reprezentowana przez czarne kropki w niewybranych komórkach i kolorowe plamy w zaznaczonych komórkach. Został wygenerowany w celu uzyskania średniej wartości 2 $, $ , więc $ s = 200. $ Zatem 200-100 = 100 $ komórki zostały losowo wybrane z górnych $ k-1 = 3 $ wierszy. Kolory przedstawiają liczbę wybranych komórek w każdej kolumnie. Jest 28 $ jedynek, 47 $ twos, 22 $ trójki i 3 $ czwórka. Zamówiona próbka odpowiada sekwencji kolorów z kolumny 1 $ do kolumny $ n = 100. $

Aby zademonstrować skalowalność i wydajność, oto polecenie R do wygenerowania próbki zgodnie z tym schematem. Pytanie dotyczy przypadku $ k = 4, n = 100 $ i $ s $ to $ n $ razy żądana średnia próbki:

  tabulate (sample.int ((k-1) * n, s-n) %% n + 1, n) + 1
 

Ponieważ sample.int wymaga $ O (sn) $ czasu i $ O ( (k-1) n) $ spacja i tabulate wymaga $ O (n) $ czasu i przestrzeni, ten algorytm wymaga $ O (\ max (sn, n)) $ czasu i $ O (kn) $ spacji : to jest scalable. W przypadku $ k = 4 $ i $ n = 100 $ mojej stacji roboczej wykonanie tego obliczenia zajmuje tylko 12 mikrosekund : to jest fficient.

(Oto krótkie wyjaśnienie kodu. Zwróć uwagę, że liczby całkowite $ x $ w $ \ {1,2, \ ldots, (k-1) n \} $ można wyrazić jednoznacznie jako $ x = nj + i $ , gdzie $ j \ in \ {0,1, \ ldots, k-2 \} $ i $ i \ in \ {1,2, \ ldots, n \}. $ Kod pobiera próbkę takich $ x, $ konwertuje je na ich $ ( i, j) $ współrzędne siatki, zlicza, ile razy pojawi się każdy element $ i $ (który będzie w zakresie od 0 $ do $ k-1 $ ) i dodaje 1 $ do każdej liczby).

Dlaczego można to uznać za effective? Jednym z powodów jest to, że właściwości dystrybucyjne tego schematu próbkowania są łatwe do obliczenia:

  • Jest wymienny: wszystkie permutacje dowolnej próbki są równie prawdopodobne.

  • Prawdopodobieństwo, że wartość $ x \ in \ {1,2, \ ldots, k \} $ pojawi się na pozycji $ i, $ , który napiszę jako $ \ pi_i (x), $ jest uzyskiwany za pomocą podstawowego hipergeometrycznego argumentu liczącego jako $$ \ pi_i (x) = \ frac {\ binom {k-1} {x-1} \ binom {(n-1) (k-1)} {sn-x +1}} {\ binom {n (k-1)} {sn}}. $$ Na przykład z $ k = 4, $ $ n = 100, $ i średnio 2,0 $ (więc $ s = 200 $ ), prawdopodobnie $ \ pi = (0,2948, 0,4467, 0,2222, 0,03630), $ jest ściśle zgodne z częstotliwościami w powyższej próbce. Oto wykresy $ \ pi_1 (1), \ pi_1 (2), \ pi_1 (3), $ i $ \ pi_1 (4) $ jako funkcja sumy:

    Figure 2

  • Prawdopodobieństwo, że wartość $ x $ pojawi się na pozycji $ i $ , podczas gdy wartość $ y $ pojawia się na pozycji $ j $ jest podobnie znajdowana jako $$ \ pi_ {ij} (x, y) = \ frac {\ binom {k-1} {x-1} \ binom {k-1} {y-1} \ binom {(n-1) (k-1)} {snx-y + 2}} {\ binom {n (k-1)} {sn}}. $$

Te prawdopodobieństwa $ \ pi_i $ i $ \ pi_ {ij} $ umożliwiają zastosowanie estymator Horvitza-Thompsona do tego planu próbkowania prawdopodobieństwa , a także do obliczenia pierwszych dwóch momentów rozkładów różnych statystyk.

Wreszcie, to rozwiązanie to versatile, o ile pozwala na proste, łatwe do przeanalizowania zmiany w celu sterowania rozkładem próbkowania.Na przykład, możesz wybrać komórki w siatce z określonymi, ale nierównymi prawdopodobieństwami w każdym wierszu lub za pomocą modelu podobnego do urny, aby zmodyfikować prawdopodobieństwa w miarę postępu próbkowania, kontrolując w ten sposób częstotliwości zliczania kolumn.

(+1) Doprawdy ostateczna elegancja.
Odpowiedź jest dla mnie zbyt trudna do naśladowania, niemniej jednak doceń ją
Cóż za elegancka i pięknie przedstawiona odpowiedź.Jeśli nie masz nic przeciwko mojej skromnej sugestii jako czytelnika, możesz najpierw rozważyć przedstawienie rozwiązania (łaty zliczające i świetny diagram), a następnie porozmawiać o implementacji i jak argumentujesz, jak pasuje do intuicji, i na koniec dlaczegoto wydajne.Może to trochę ułatwić śledzenie.
@Neil Dziękuję za sugestię.Myślę, że jest dobry i rozważę to dokładnie.
To piękna i satysfakcjonująca odpowiedź.Chciałem zauważyć, że liczby są w tym przypadku na tyle małe (100 liczb sumujących się do 190), że możemy obliczyć równomierny rozkład wszystkich wartości, które spełniają.Przeprowadziłem kilka obliczeń, aby porównać twoją dystrybucję z tym i stwierdziłem, że twoja ** znacznie bardziej prawdopodobne (miliardy w niektórych przypadkach) wybierze małe wartości inne niż 1 **.Na przykład model prawie nigdy nie da rozkładów z> 45 "jedynek" (~ 0,002% szansy na 46, zniknięcie na więcej), ale obejmuje to ~ 58% jednolitych wartości modelu.
Xi'an
2020-01-06 11:58:22 UTC
view on stackexchange narkive permalink

Pytanie jest niedostatecznie określone, ponieważ ograniczenia dotyczące częstotliwości \ begin {align} n_1 + 2n_2 + 3n_3 + 4n_4& = 100 mln \\ n_1 + n_2 + n_3 + n_4& = 100 \ end {align} nie określaj rozkładu: „losowy” nie jest powiązany z określonym rozkładem, chyba że PO oznacza „jednolity”. Na przykład, jeśli istnieje jedno rozwiązanie $ (n_1 ^ 0, n_2 ^ 0, n_3 ^ 0, n_4 ^ 0) $ do powyższego systemu, to dystrybucja zdegenerowana przy tym rozwiązaniu generuje losowe losowanie, które zawsze wynosi $ (n_1 ^ 0, n_2 ^ 0, n_3 ^ 0, n_4 ^ 0) $ .

W przypadku, gdy pytanie dotyczy symulacji jednolitej dystrybucji w siatce \ begin {align} n_1 + 2n_2 + 3n_3 + 4n_4& = 100M \\ n_1 + n_2 + n_3 + n_4& = 100 \ end {align} zawsze można użyć algorytmu Metropolis-Hastings. Zaczynając od $ (n_1 ^ 0, n_2 ^ 0, n_3 ^ 0, n_4 ^ 0) $ , utwórz łańcuch Markowa, proponując symetryczne, losowe perturbacje wektora $ (n_1 ^ t, n_2 ^ t, n_3 ^ t, n_4 ^ t) $ i zaakceptuj, jeśli wynik mieści się w $ \ {1, 2, 3, 4 \} ^ 4 $ i spełnia ograniczenia.

Na przykład, oto surowy render R:

  cenM = 293
#starting point (n¹, n³, n⁴)
n<-sample (1: 100,3, rep = TRUE)
while ((sum (n) >100) | (n [2] -n [1] + 2 * n [3]! = cenM-200))
    n<-sample (1: 100,3, rep = TRUE)
Sieć #Markov
for (t in 1: 1e6) {
  prop<-n + sample (-10: 10,3, rep = TRUE)
  if ((sum (prop) <101) &
      (prop [2] -prop [1] + 2 * prop [3] == cenM-200) &
      (min (prop) >0))
        n = prop}
c (n [1], 100-sum (n), n [-1])
 

z rozkładem $ (n_1, n_3, n_4) $ w 10⁶ iteracjach:

enter image description here

Jeśli chcesz losować same liczby całkowite,

  sample (c (rep (1, n [1]), rep (2,100-sum (n)), rep (3, n [2]), rep (4, n [3])) )
 

to szybki, brudny sposób & na utworzenie próbki.

dzięki.ale nie mogę zrozumieć, jak mogę to wykorzystać, aby uzyskać 4 liczby całkowite (od 1 do 4)
To generuje liczby 1,2,3,4 $ n_1, n_2, n_3, n_4) $, tak że jest ich 100, a suma to cenM.Same liczby całkowite są losową permutacją $ n_1 $ 1, ..., $ n_4 $ 4.
John
2020-01-07 21:28:57 UTC
view on stackexchange narkive permalink

Chcę ... uh ... "osłabić" niesamowitą odpowiedź @ Whubera, która według @TomZingera jest zbyt trudna do naśladowania. Mam na myśli to, że chcę to ponownie opisać w taki sposób, że myślę, że Tom Zinger zrozumie, ponieważ jest to zdecydowanie najlepsza odpowiedź tutaj. A ponieważ Tom stopniowo stosuje tę metodę i odkrywa, że ​​potrzebuje, powiedzmy, znać rozmieszczenie próbek, a nie tylko ich średnią, odpowiedź Whubera będzie właśnie tym, czego szuka.

Krótko mówiąc: nie ma tu żadnych oryginalnych pomysłów, tylko prostsze wyjaśnienie.

Chcesz utworzyć $ n $ liczby całkowite od $ 1 $ do 4 $ ze średnią $ r $ . Zasugeruję obliczanie $ n $ liczb całkowitych od $ 0 $ do 3 $ ze średnią $ r-1 $ , a następnie dodaj po jednym do każdego z nich. Jeśli możesz zrobić to drugie, możesz rozwiązać pierwszy problem. Na przykład, jeśli chcemy 10 liczb całkowitych między 1 $ a 4 $ ze średnią 2,6 $ , możemy zapisać te 10 $ liczby całkowite z przedziału od 0 $ do 3 $ ...

0,3,2,1,3,1,2,1,3,0

którego średnia wynosi 1,6 USD ; jeśli zwiększymy każdy o 1 $ , otrzymamy

1,4,3,2,4,2,3,2,4,1

którego średnia wynosi 2,6 USD . To takie proste.

Pomyślmy teraz o liczbach od 0 $ do 3 $ . Będę myśleć o nich jako o „ile przedmiotów mam w„ małym ”zestawie?” Mogę nie mieć żadnych przedmiotów, jednego przedmiotu, dwóch lub trzech elementów. Więc lista

0,3,2,1,3,1,2,1,3,0

reprezentuje dziesięć różnych małych zestawów. Pierwsza jest pusta; druga ma trzy elementy i tak dalej. Całkowita liczba elementów we wszystkich zestawach to suma dziesięciu liczb, czyli 16 $ . A średnia liczba elementów w każdym zestawie to suma podzielona przez 10 USD , stąd 1,6 $ .

Pomysł jest taki: załóżmy, że zrobisz sobie dziesięć małych zestawów, z całkowitą liczbą elementów wynoszącą 10 t $ za pewną liczbę $ t $ . Wtedy średni rozmiar zestawów wyniesie dokładnie $ t $ . W ten sam sposób, jeśli utworzysz zestawy $ n $ z łączną liczbą elementów $ nt $ span >, średnia liczba elementów w zestawie wyniesie $ t $ . Mówisz, że interesuje Cię sprawa $ n = 100 $ .

Zróbmy konkretny przykład: potrzebujesz 100 elementów od 1 do 4, których średnia wynosi 1,9 USD . Korzystając z pomysłu z pierwszego akapitu, zmienię to na „make 100 $ ints między $ 0 $ span> i 3 $ , których średnia wynosi 0,9 $ ". Kiedy skończę, dodam 1 $ do każdego z moich int, aby znaleźć rozwiązanie Twojego problemu. Tak więc moja średnia docelowa to $ t = 0,9 $ .

Chcę zrobić zestawy 100 USD , każdy zawierający od 0 $ do 3 $ elementów, o średnim rozmiarze zestawu 0,9 $ .

Jak zauważyłem powyżej, oznacza to, że musi istnieć całkowita 100 $ \ cdot 0.9 = 90 $ elementów w zestawy. Z liczb 1, 2, \ ldots, 300 $ , wybiorę dokładnie 90 $ . Mogę wskazać wybrane, tworząc listę 300 kropek i X-ów:

..X .... X ... XX ...

gdzie powyższa lista wskazuje, że wybrałem liczby 3, 9, 13, 14, a następnie wiele innych, których nie pokazałem, ponieważ mam dość pisania. :) Mogę wziąć tę sekwencję 300 kropek i X i podzielić ją na trzy grupy po 100 kropek, które układam jedna na drugiej, uzyskując coś, co wygląda tak:

  ... X .... X..X ..... X ...
.X ... X ..... X ... X .....
..X ... X.X..X ...... X ..
 

ale dotyczy pełnych 100 pozycji w każdym wierszu. Liczba X w każdym wierszu może się różnić - na przykład może być 35 w pierwszym rzędzie, 24 w drugim i 31 w trzecim, i to jest OK. [Dzięki Whuberowi za wskazanie, że popełniłem błąd w pierwszej wersji roboczej!]

Teraz spójrz na każdą kolumnę : każda kolumna może być traktowana jako zestaw, a ten zestaw zawiera od 0 do 3 „X”. Mogę napisać podliczenia pod wierszami, aby uzyskać coś takiego:

  ... X .... X..X ..... X ...
.X ... X ..... X ... X .....
..X ... X.X..X ...... X ..
011101102003000101100
 

To znaczy, że utworzyłem 100 liczb, każda z przedziału od 1 do 3. Suma tych 100 liczb musi być łączną liczbą X-ów we wszystkich trzech wierszach, czyli 90. Zatem średnia musi być 90/100 = 0,9 USD , zgodnie z potrzebami.

Oto kroki prowadzące do uzyskania 100 liczb całkowitych od 1 do 4, których średnia wynosi dokładnie $ s $ .

  1. Niech $ t = s - 1 $ .
  2. Oblicz $ k = 100 t $ ; tyle w sumie umieścimy w wierszach.
  3. Zrób listę 300 kropek lub X, $ k $ , z których Xs.
  4. Podziel to na trzy rzędy po 100 kropek lub X, z których każdy zawiera mniej więcej jedną trzecią znaków X.
  5. Ułóż je w tablicy i oblicz sumy kolumn, uzyskując 100 liczb całkowitych między 0 $ a 3 $ span >. Ich średnia będzie wynosić $ t $ .
  6. Dodaj po jednej do każdej sumy kolumny, aby otrzymać 100 liczb całkowitych od 1 $ do 4 $ , których średnia to $ s $ .

Teraz najtrudniejsza część jest tak naprawdę w kroku 4: jak wybrać 300 $ elementów, $ k $ z których to „X”, a pozostałe 300-tys. $ , z czego "."? Okazuje się, że R ma funkcję, która dokładnie to robi.

A potem whuber powie Ci, jak go używać: piszesz

  tabulate (sample.int ((k-1) * n, s-n) %% n + 1, n)
 

W Twoim przypadku $ n = 100 $ i $ s $ , łączna liczba elementów we wszystkich małych zestawach to 100r $ , a chcesz mieć liczby od 1 $ do 4 $ , więc $ k = 4 $ , więc $ k -1 $ (największy rozmiar dla „małego zestawu”) to 3, więc otrzymujemy

  tabulate (sample.int (3 * 100, 100r-100) %% 100 + 1, n)
 

lub

  tabulate (sample.int (3 * 100, 100 * (r-1)) %% 100 + 1, 100)
 

lub, używając mojego imienia i nazwiska $ t $ dla $ r - 1 $ , stanie się

  tabulate (sample.int (3 * 100, 100 * t) %% 100 + 1, 100)
 

„+1” na końcu jego pierwotnej formuły to dokładnie krok potrzebny do konwersji z „liczb między 0 $ a 3 $ " na "numery od 1 $ do 4 $ ".

Pracujmy od wewnątrz i uprośćmy do $ n = 10 $ , abym mógł pokazać przykładowe wyniki:

  tabulate (sample.int (3 * 10, 10 * t) %% 10 + 1, 10)
 

I zmieńmy na $ t = 1,9 $ , więc otrzymamy

  tabulate (sample.int (3 * 10, 10 * 1,9) %% 10 + 1, 10)
 

Zaczynając od sample.int (3 * 10, 10 * 1,9) : w ten sposób powstaje lista 19 $ liczb całkowitych między 1 $ i 30 $ . (tj. rozwiązał problem polegający na wybieraniu $ k $ liczb z łącznej kwoty - 300 $ w Twój prawdziwy problem, 30 $ w moim mniejszym przykładzie).

Jak sobie przypominasz, chcemy utworzyć trzy rzędy po dziesięć kropek-X każdy, coś w rodzaju

  X.X.XX.XX.
 XXXX.XXX ..
 XX.X.XXX ..
 

Możemy przeczytać ten tekst od lewej do prawej z góry na dół (tj. normalny porządek czytania), aby stworzyć listę lokalizacji dla X: pierwsza pozycja to kropka; druga i trzecia to X i tak dalej, więc nasza lista lokalizacji zaczyna się $ 1, 3, 5, 6, \ ldots $ . Kiedy docieramy do końca wiersza, po prostu liczymy w górę, więc na powyższym obrazku lokalizacje X będą wynosić $ 1, 3, 5, 6, 8, 9, 11, 12, 13, 14, 16, 17, 18, 21, 22, 24, 26, 27, 28 $ . Czy to jasne?

Cóż, kod Whubers tworzy dokładnie taką listę lokalizacji z jej najbardziej wewnętrzną sekcją.

Następna pozycja to %% 10 ; która przyjmuje liczbę i tworzy resztę z dzielenia przez dziesięć. Więc nasza lista to $ 1, 3, 5, 6, 8, 9, 1, 2, 3, 4, 6, 7, 8, 1, 2, 4, 6, 7, 8 $ . Jeśli podzielimy to na trzy grupy - te, które pochodzą z liczb od 1 $ do 10 $ , te, które pochodzą z liczb od 11 $ do 20 $ , oraz te, które pochodzą z liczb 21 $ do 30 $ , otrzymujemy $ 1, 3, 5, 6, 8, 9 $ , następnie $ 1, 2, 3, 4, 6, 7, 8, $ i na końcu 1 $, 2, 4, 6, 7, 8 $ . Mówią ci, gdzie znajdują się X w każdym z trzech rzędów. Występuje tutaj subtelny problem: gdyby na pozycji 10 w pierwszym wierszu znajdował się X, pierwsza z naszych trzech list byłaby $ 1, 3, 5, 6, 8, 9 , 0 $ , a funkcja tabulate nie lubi „0”. Whuber dodaje 1 do każdej pozycji na liście, aby uzyskać $ 2, 4, 6, 7, 9, 10, 1 $ . Przejdźmy do ogólnych obliczeń:

  tabulate (sample.int (3 * 10, 10 * 1,9) %% 10 + 1, 10)
 

To pyta „dla tych 30 $ liczb, z których każda wskazuje, czy w jakiejś kolumnie jest znak X, powiedz mi, ile razy każda kolumna (z 1 $ do 10 $ - to właśnie mówi ci ostatnia" 10 "), tzn. powiedz mi ile X są w każdej kolumnie. Wynik to 0 3 2 2 2 1 3 2 3 1 które (z powodu przesunięcia o jedną rzecz) musisz odczytać jako „nie ma X-ów w dziesiątej kolumnie; 3 X-y w pierwszej kolumnie; 2 X-y w drugiej kolumnie” i tak dalej w górę do „jest jeden X w dziewiątej kolumnie”.

Daje to dziesięć liczb całkowitych z przedziału od 0 $ do 3 $ , których suma wynosi 19 $ , stąd jego średnia wynosi 1,9 $ . Jeśli zwiększysz każdy o 1, otrzymasz dziesięć liczb całkowitych od 1 $ do 4 $ , których suma wynosi 29 $ , stąd średnia wartość 2,9 $ .

Mam nadzieję, że możesz uogólnić na $ n = 100 $ .

+1 Witamy w naszej witrynie, John.Doceniam twoje wysiłki w celu wyjaśnienia i wyjaśnienia tych pomysłów.W pewnym momencie twój opis odbiega od tego, co robi kod: nie dzieli się trzech wierszy na grupy po 30 sztuk.Zamiast tego zaznaczonych jest 90 komórek z 300 komórek w tych wierszach.Zwykle każdy wiersz będzie miał inną liczbę komórek.
Dzięki ... Trochę się o to martwiłem, kiedy to pisałem, ale byłem w połowie zdania i zanim skończyłem, ta myśl odleciała.Zmienię, aby spróbować to naprawić.
Noah
2020-01-06 05:51:48 UTC
view on stackexchange narkive permalink

Możesz użyć sample () i wybrać określone prawdopodobieństwa dla każdej liczby całkowitej. Jeśli zsumujesz iloczyn prawdopodobieństw i liczb całkowitych, otrzymasz oczekiwaną wartość rozkładu. Jeśli więc masz na myśli średnią wartość, powiedz $ k $ , możesz rozwiązać następujące równanie: $$ k = 1 \ times P (1) + 2 \ times P (2) + 3 \ times P (3) + 4 \ times P (4) $$ span > Możesz dowolnie wybrać dwa prawdopodobieństwa i rozwiązać trzecie, które określa czwarte (ponieważ $ P (1) = 1- (P (2) + P (3) + P (4)) $ , ponieważ prawdopodobieństwa muszą sumować się do 1 $ ). Na przykład niech $ k = 2.3 $ , $ P (4) =. 1 $ i $ P (3) =. 2 $ . Mamy to $$ k = 1 \ times [1- (P (2) + P (3) + P (4)] + 2 \ times P (2) + 3 \ times P ( 3) + 4 \ times P (4) $$ $$ 2.3 = [1 - (P (2) +. 1 + .2)] + 2 * P (2) + 3 \ times .2 + 4 \ times .1 $$ $$ 2.3 = .7 + P (2) + .6 + .4 $$ $$ P (2) =. 6 $$ $$ P (1) = 1- (P (2) + P (3) + P (4) = 1 - (.6 + .1 + .2) =. 1 $$

Możesz więc uruchomić x <- sample (c (1, 2, 3, 4), 1e6, replace = TRUE, prob = c (.1, .6, .2, .1)) i mean (x) to około 2,3 USD

To wyjaśnia, jak ograniczyć średnią * rozkładu *.Ale OP określił w komentarzach, że chce ograniczyć * średnią próbki * (która nie będzie pasować do średniej rozkładu, z wyjątkiem oczekiwania).Z drugiej strony wydaje się, że PO i tak zaakceptował tę odpowiedź, więc być może wcale tego nie chcieli.
-1
Ta odpowiedź nie daje sposobu, aby średnia próbki była równa wartości docelowej: w większości przypadków średnia * nie * będzie równa wartości docelowej.
@TomZinger Tak.Ta odpowiedź ładnie opisuje, jak próbkować z rozkładu o podanej średniej docelowej.Jednak średnia z próby pobranej z rozkładu na ogół nie będzie równa średniej z rozkładu.
Napisałem swoją odpowiedź, zanim zobaczyłem ten komentarz, ale pomyślałem, że i tak będzie to przydatne.Wyobraziłem sobie, że wymagałoby to problemu optymalizacji programowania liczb całkowitych, aby uzyskać średnią próbną dokładnie równą pewnej wartości.
@user20160 Nie jestem pewien, czy dobrze zrozumiałem, więc przepraszam, jeśli wcześniej nie odpowiedziałem poprawnie.Myślę, że jest odwrotnie, próbka ma stałą średnią, na podstawie której chcę próbkować.Przypuszczam, że średnia dystrybucji wynosi 2,5 (jednolita).Chcę tendencyjnego samplowania.
gunes
2020-01-06 05:29:08 UTC
view on stackexchange narkive permalink

Oto prosty algorytm: Utwórz $ n-1 $ losowe liczby całkowite z zakresu $ [1,4]$ i oblicz $ n ^ {th} $ liczbę całkowitą, aby średnia była równa określonej wartości.Jeśli ta liczba jest mniejsza niż 1 $ lub większa niż 4 $ , wówczas rozdzielaj nadwyżkę jeden po drugim /brak na innych liczbach całkowitych, npjeśli liczba całkowita to 5 $ , mamy nadwyżkę 1 $ ;i możemy dodać to do następnej liczby całkowitej, jeśli nie jest to 4 $ , w przeciwnym razie dodać do następnej itd. Następnie przetasuj całą tablicę.

Jednym dużym problemem związanym z tą propozycją jest to, że nie zawiera ona żadnych wskazówek dotyczących oczekiwanych częstotliwości wartości wynikowych.
Chociaż interesujące, pomyślałem, że OP wymaga tylko algorytmu do generowania pożądanej tablicy liczb całkowitych w sposób niedeterministyczny.
Myślę, że to raczej unika istoty pytania, niż daje satysfakcjonującą odpowiedź.Dobra odpowiedź powinna być w stanie scharakteryzować proponowany przez siebie rozkład w znaczący sposób, na przykład poprzez podanie wzoru na prawdopodobieństwa lub przynajmniej podanie pierwszych kilku chwil.
Niewielkie dostosowanie symulowanych danych jest prawdopodobnie `` właściwe '', jednak patrząc na projekt ekspercki w przypadkach, w których wymagane jest bardziej znaczące średnie odchylenie, w zależności od zamierzonego celu, może być, z perspektywy testowania hipotez, `` podejrzane '' wmój osąd.Nadmierne lub niedostateczne obciążenie losowego projektu w celu uzasadnienia lub odrzucenia możliwych nielosowych efektów, które zostały faktycznie zaobserwowane, może być wątpliwą praktyką.Tak więc każda metoda, która wprowadza bardzo małą korektę do ostatnich, powiedzmy 100 obserwacji, jest prawdopodobnie według mnie zachowana w dobrej praktyce.
N4v
2020-01-09 21:46:53 UTC
view on stackexchange narkive permalink

Jako uzupełnienie odpowiedzi Whubera, napisałem skrypt w Pythonie, który przechodzi przez każdy krok schematu próbkowania. Zauważ, że ma to na celu ilustrację i niekoniecznie jest wydajne.

Przykładowe dane wyjściowe:

  n = 10, s = 20, k = 4

Siatka startowa
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
X X X X X X X X X X

Wypełniona siatka
X X. . X. X. . X
. . X X X. . . . .
. . . . X X. . . .
X X X X X X X X X X

Siatka końcowa
X X. . X. X. . X
. . X X X. . . . .
. . . . X X. . . .
X X X X X X X X X X
2 2 2 2 4 2 2 1 1 2
 

Skrypt:

  import numpy jako np

# Określ parametry początkowe
liczby całkowite = [1, 2, 3, 4]
n = 10
s = 20
k = len (liczby całkowite)


def print_grid (siatka, tytuł):
    print (f '\ n {tytuł}')
    dla rzędu w siatce:
        print ('' .join ([str (element) dla elementu w wierszu]))


# Utwórz siatkę startową
grid = []
dla i w zakresie (1, k + 1):
    if i < k:
        grid.append (['.' for j in range (n)])
    jeszcze:
        grid.append (['X' dla j w zakresie (n)])

# Wydrukuj siatkę startową
print_grid (grid, 'Siatka startowa')

# Losowo i jednolicie wypełnij pozostałe wiersze
indexes = np.random.choice (range ((k - 1) * n), s - n, replace = False)
dla i w indeksach:
    row = i // n
    col = i% n
    grid [rzad] [col] = „X”

# Wydrukuj wypełnioną siatkę
print_grid (grid, 'Wypełniona siatka')

# Oblicz, ile komórek zostało zaznaczonych w każdej kolumnie
column_counts = []
dla kolumny w zakresie (n):
    count = sum (1 for i in range (k) if grid [i] [col] == 'X')
    column_counts.append (liczba)
grid.append (column_counts)

# Wydrukuj ostatnią siatkę i sprawdź, czy kolumna liczy sumę do s
print_grid (grid, 'Final grid')
wydrukować()
print (f'Czy kolumna liczy sumę do {s}? {sum (column_counts) == s}. ')
 
gruvn
2020-04-07 18:56:31 UTC
view on stackexchange narkive permalink

Zamieniłem odpowiedź Whubera w funkcję r.Mam nadzieję, że to komuś pomoże.

  • n to liczba żądanych liczb całkowitych;
  • t to środek, którego chcesz;i
  • k to górny limit, jaki chcesz uzyskać dla zwracanych wartości
  whubernator<-function (n = NULL, t = NULL, kMax = 5) {
  z = tabulate (sample.int (kMax * (n), (n) * (t), replace = F) %% (n) +1, (n))
  powrót (z)
}
 

Wygląda na to, że działa zgodnie z oczekiwaniami:

  > w = whubernator (n = 10, t = 4,2)
> mean (w)
[1] 4.2
Długość > (w)
[1] 10
> w
 [1] 3 5 3 5 5 3 4 5 5 4
 

Może zwrócić 0, co odpowiada moim potrzebom.

  > whubernator (n = 2, t = 0,5)
[1] 1 0
 


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 4.0, w ramach której jest rozpowszechniana.
Loading...