Oblicz przedział punktacji Wilsona

15

Wilson przedział wynik jest przedział ufności z prawdopodobieństwem sukcesu, na podstawie proporcji sukcesów w zbiorze prób Bernoulliego (próba Bernoulliego jest badaniem, w którym możliwe są dokładnie dwa efekty: sukces lub niepowodzenie ). Przedział jest określony następującą formułą:

Interwał Wilsona

Dwie wartości podane w formule są górną i dolną granicą przedziału. n S i n F to odpowiednio liczba sukcesów i niepowodzeń, a n to całkowita liczba prób (równoważna n S + n F ). z jest parametrem zależnym od pożądanego poziomu ufności. Do celów tego wyzwania zostanie użyte z = 1,96 (co odpowiada 95% przedziałowi ufności) 1 .

Biorąc pod uwagę nieujemne liczby całkowite n S i n F , wyprowadzaj granice przedziału wyniku Wilsona.

Zasady

  • Dane wyjściowe muszą być tak dokładne, jak to możliwe, do prawdziwych wartości, w granicach implementacji zmiennoprzecinkowej Twojego języka, ignorując wszelkie potencjalne problemy wynikające z niedokładności arytmetycznych zmiennoprzecinkowych. Jeśli twój język jest zdolny do arytmetyki o dowolnej precyzji, musi być co najmniej tak precyzyjny jak arytmetyka o podwójnej precyzji IEEE 754.
  • Dane wejściowe będą w reprezentatywnym zakresie dla rodzimego typu liczb całkowitych w twoim języku, a dane wyjściowe będą w reprezentatywnym zakresie dla rodzimego typu zmiennoprzecinkowego twojego języka.
  • n zawsze będzie dodatni.
  • Kolejność wyjść nie ma znaczenia.

Przypadki testowe

Format: n_s, n_f => lower, upper

0, 1 => 0.0, 0.7934567085261071
1, 0 => 0.20654329147389294, 1.0
1, 1 => 0.09452865480086611, 0.905471345199134
1, 10 => 0.016231752262825982, 0.3773646254862038
10, 1 => 0.6226353745137962, 0.9837682477371741
10, 90 => 0.05522854161313612, 0.1743673043676654
90, 10 => 0.8256326956323345, 0.9447714583868639
25, 75 => 0.17545094003724265, 0.3430464637007583
75, 25 => 0.6569535362992417, 0.8245490599627573
50, 50 => 0.40382982859014716, 0.5961701714098528
0, 100 => 0.0, 0.03699480747600191
100, 0 => 0.9630051925239981, 1.0

  1. zWartość jest 1-α/2th kwantyl standardowego rozkładu normalnego, gdzie αjest poziom istotności. Jeśli chcesz mieć 95% przedział ufności, twój poziom istotności to α=0.05, a zwartość to 1.96.
Mego
źródło
Powiązane: Najszybszy problem z bronią na Zachodzie . Miałem zamiar uczynić to wyzwaniem, ale myślę, że mnie pobiłaś. : /
mbomb007

Odpowiedzi:

6

Mathematica, 48 bajtów (kodowanie UTF-8)

({-1,1}√((s=1.4^4)##/+##+s^2/4)+#+s/2)/(s+##)&

Funkcja bez nazwy, która bierze dwa argumenty w kolejności n_s, n_fi zwraca uporządkowaną parę liczb rzeczywistych. Trzy bajtowy symbol reprezentujący funkcję pierwiastka kwadratowego to U-221A.

Wykorzystuje fakt, że poprzedzenie ##liczbą powoduje iloczyn dwóch argumentów, a +##ich sumę. Wykorzystuje również fakt, że produkty i sumy automatycznie przewijają listy, dzięki czemu {-1,1}√(...)implementuje ± w formule. Zdefiniowanie stałej s = z^2zamiast zsiebie pozwoliło również zaoszczędzić kilka bajtów. (Przeważnie jestem po prostu dumny z oszczędzania bajtu, zauważając, że 1.4^4to jest dokładnie 1.96^2!)

Greg Martin
źródło
Czy Mathematica może używać dowolnych kodowań? Symbol pierwiastka kwadratowego ma 1 bajt w wielu kodowaniach jednobajtowych.
Mego
Może rzeczywiście używać wielu kodowań - na przykład Mac OS Roman, który ma wspomnianą właściwość. Rozumiem jednak, że musiałbym dołączyć bajty niezbędne do przejścia na kodowanie inne niż domyślne, które w tym przypadku jest więcej niż 2 „zmarnowane” bajty.
Greg Martin
Och, wymaga przełącznika wiersza poleceń (lub jakiegoś wywołania funkcji)? Obrzydliwy.
Mego
4
Mathematica to wspaniałe zestawienie niesamowitych i obrzydliwych: D
Greg Martin
3

Perl 6 , 66 bajtów

->\s,\f,\z=1.96 {(s+(-z|z)*sqrt(s*f/(s+f)+z*z/4)+z*z/2)/(s+f+z*z)}

Ta funkcja faktycznie zwraca skrzyżowanie dolnej i górnej granicy; na przykład, jeśli zostanie wywołany z argumentami 100 i 0, zwraca:

any(0.963005192523998, 1)

Jest to co najmniej nietradycyjny format wyjściowy, ale nie określono żadnego konkretnego formatu, a obie wymagane wartości są obecne.

Sean
źródło
Wydaje mi się to w porządku. Brak określonego formatu wyjściowego był celowy - wymaganie określonego formatu wyjściowego daje przewagę niektórym językom i niepotrzebnie komplikuje wyzwanie. Dopóki obie wartości wyjściowe są obecne w jakiejś użytecznej formie, jest to dopuszczalne.
Mego
3

05AB1E , 34 bajty

"1.96"Dn©4/¹P¹O/+t*D()®;+¹0è+®¹O+/

Dane wejściowe mają postać Dane [n_s, n_f]
wyjściowe mają postać[upper, lower]

Wypróbuj online!

Wyjaśnienie

"1.96"                             # push 1.96
      Dn©                          # duplicate, square, store a copy in register
         4/                        # divide by 4
           ¹P¹O/                   # product of input divided by sum of input
                +                  # add this to (z^2)/4
                 t*                # sqrt and multiply with z
                   D()             # wrap in list together with a negated copy
                      ®;+          # add (z^2)/2
                         ¹0è+      # add n_s
                             ®¹O+/ # divide by z^2+n
Emigna
źródło
3

Runiczne Zaklęcia , 105 bajtów

#StillBetterThanJava

/:2,:2,i:3s:3s:i:3s*3s+::6s4s,+'qA{*:Z4s3TRr4s{++}\
\p2:,C1Ä'<> yyyyyyyyyyyyyyyyyyy'Ä1C,2p:2,//@S ',+ /

Wypróbuj online!

Dane wejściowe mają formę n_s n_f
wyjściowe mają postać lower upperi mają spację końcową

O Boże, to jest bałagan. Oto nieopakowana wersja:

>'Ä1C,:2p:2,:2,i:3s:3s:i:3s*3s+::6s4s,+'qA{*:Z4s3TRr4s{++}+,' S@
                  > yyyyyyyyyyyyyyyyyyy'Ä1C,2p:2,//

Wszystkie te ymają spowolnić drugie IP, aby Tdotarło do punktu ransfer we właściwym czasie (tj. Drugim). Spowoduje to przesunięcie 3 najlepszych pozycji jednego wskaźnika na drugi (konfiguracja tej akcji jest przedstawiona poniżej). 'Ä1C,generujez , dzieląc znak 196 przez 100 (dup, kwadrat, dup, div 2, dup, div 2 ...). Cała reszta to tylko matematyka i manipulacja stosami, aby przesunąć przyszłe wartości w dół stosu, dopóki nie będą potrzebne. W większości kończą się we właściwej kolejności i tylko do momentu r4s{++}, gdy musimy odwrócić stos i obrócić całość, aby uzyskać wartości, które chcemy obok siebie.

Prawdopodobnie jest miejsce na ulepszenia, ale jest wystarczająco złożone, że go nie widzę. Cholery, że odczytać przypadkowo wartość „z”, a nie „N” w oryginalnym wzorze w jednym punkcie i ustalenie , że było trudne.

Musiałem wyciągnąć kartki i symulować stosy, aby upewnić się, że są poprawne:

Stack Funtimes

Każdy z nich ma wartość na obu końcach ze względu na liczbę zmiennych (np. Miałbym jedną z S i jedną z F, wstawiłbym je oba, odwrócił jeden i dodał S + F, który był włączony drugi koniec do góry stosu). Możesz zobaczyć, że jedna z sqrt(...)kart ma Sna dolnej krawędzi.

Draco18s nie ufa już SE
źródło
3

R , 58 53 51 49 41 bajtów

-15 bajtów dzięki J.Doe. -2 bajty dzięki Giuseppe.

function(x,y)prop.test(t(c(x,y)),cor=F)$c
Robert S.
źródło
1
Podoba mi się, gdy R rywalizuje z językami golfowymi ...
J.Doe
2

APL (Dyalog Unicode) , 50 bajtów

{(+/⍺⍵z)÷⍨(⍺+z÷2)(-,+).5*⍨z×(⍺×⍵÷⍺+⍵)+4÷⍨z3.8416}

Wypróbuj online!

Infix Dfn, biorąc ns i nfa.

Dzięki H.PWiz i dzaima za pomoc.

W jaki sposób:

                                        z3.8416   Set z=1.96²
                                     4÷⍨           Divide it by 4
                                    +              plus
                           (⍺×⍵÷⍺+⍵)              (nf×nsn
                         z×                        ×z²
                     .5*⍨                          to the power .5 (square root)
                (-,+)                              ±
         (⍺+z÷2)                                   ns+(z²/2)
(+/⍺⍵z)÷⍨                                         all divided by nf+ns+z²
J. Sallé
źródło
@ Adám To nie jest ani wyrażenie, ani kompletny program, ale możesz zrobić z niego wyrażenie, inicjując je zprzy jego najbardziej prawym użyciu: ...÷z+(z←1.908)++dla tej samej liczby bajtów. Również: ⊣×⊢÷+->×÷+
ngn
1
@ngn Racja, ale w rzeczywistości jest to dozwolone przez podwójny meta konsensus: (1) i (2) .
Adám
1

Python, 79 67 bajtów

lambda s,f,z=3.8416:2j**.5*(s-(-z*(f*s/(f+s)+z/4))**.5+z/2)/(f+s+z)

Dane wyjściowe to złożona liczba całkowita z interwałem zapisanym jako część rzeczywista / urojona.

orlp
źródło
1

dc , 71 bajtów

16k?dsa2*?sb1.96 2^dso+dlalb4**lalb+/lo+vlov*dsd+lalblo++2*dsx/rld-lx/f

Bierze oba wejścia w dwóch oddzielnych wierszach po wywołaniu i wysyła w dwóch oddzielnych wierszach z górną granicą na dole i dolną granicą na górze .

Na przykład:

bash-4.4$ dc -e '16k?dsa2*?sb1.96 2^dso+dlalb4**lalb+/lo+vlov*dsd+lalblo++2*dsx/rld-lx/f'
10                # Input n_s
90                # Input n_f
.0552285416131361 # Output lower bound
.1743673043676654 # Output upper bound
R. Kap
źródło
1

Rakieta 134 bajtów

(let*((n(+ s f))(z 1.96)(h(* z z))(p(/ 1(+ n h)))(q(+ s(/ h 2)))(r(* z(sqrt(+(/(* s f) n)(/ h 4))))))(values(* p(- q r))(* p(+ q r))))

Nie golfowany:

(define (g s f)
  (let* ((n (+ s f))
         (z 1.96)
         (zq (* z z))
         (p (/ 1 (+ n zq)))
         (q (+ s (/ zq 2)))
         (r (* z (sqrt (+ (/(* s f) n) (/ zq 4))))))
    (values (* p (- q r)) (* p (+ q r)))))

Testowanie:

(g 1 10)

Wynik:

0.016231752262825982
0.3773646254862038
rnso
źródło
1

Java 7, 130 bajtów

Gra w golfa:

double[]w(int s,int f){double n=s+f,z=1.96,x=z*z,p=s+x/2,d=z*Math.sqrt(s*f/n+x/4),m=1/(n+x);return new double[]{m*(p-d),m*(p+d)};}

Nie golfowany:

double[] w(int s, int f)
{
    double n = s + f, z = 1.96, x = z * z, p = s + x / 2, d = z * Math.sqrt(s * f / n + x / 4), m = 1 / (n + x);
    return new double[]
    { m * (p - d), m * (p + d) };
}

Wypróbuj online

Zwraca tablicę typu double o długości 2, prawdopodobnie może być bardziej golfa.

brzoskwinia
źródło
1

> <> z -vflagą, 100 bajtów

:{:@:}*@+:@,24a,a,-:@:*:&4,+:\$~*{&:&2,+}:{:@@-{&+:&,nao+&,n;
,}:{::*@@-:0$0(?$-1a,:*:*:*(?\}:{:@,+2

Oczekuje, że dane wejściowe będą obecne na stosie podczas uruchamiania, w kolejności n_s, n_f. Wypróbuj online!

Co za głupi język, aby spróbować tego w ...

Ponieważ> <> nie ma wykładnika ani operatora pierwiastka, pierwiastek kwadratowy jest obliczany w drugim wierszu kodu przy użyciu metody babilońskiej , z dokładnością do 1e-8- dla każdego przykładu, który próbowałem, jest on dokładny z dokładnością do co najmniej 10 miejsc po przecinku. Jeśli nie jest to wystarczająco precyzyjne, granice można zaostrzyć, dodając więcej :*w drugiej linii, przesuwając rzeczy, aby utrzymać lustra w linii.

Dane wyjściowe mają następującą postać:

<lower bound>
<upper bound>
Sok
źródło
1

Pyth, 38 bajtów

J*K1.96Kmc++dhQcJ2+sQJ_B*K@+cJ4c*FQsQ2

Wejście jest w postaci listy wartości [n_s, n_f]. Wyjście jest [upper, lower]Spróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .

J*K1.96Kmc++dhQcJ2+sQJ_B*K@+cJ4c*FQsQ2   Implicit: Q=eval(input())

  K1.96                                  Set variable K=1.96 (z)
J*K    K                                 Set variable J=K*K (z^2)
                                *FQ      Product of input pair
                               c   sQ    Divide the above by the sum of the input pair
                            cJ4          J / 4
                           +             Add the two previous results
                          @          2   Take the square root of the above
                        *K               Multiply by K
                      _B                 Pair the above with itself, negated
        m                                Map each in the above, as d, using:
             hQ                            First value of input (i.e. n_s)
               cJ2                         J / 2
          ++d                              Sum the above two with d
         c                                 Divided by...
                  +sQJ                     ... (J + sum of input)
Sok
źródło
1

Galaretka , 30 bajtów

×÷++1.96²©HH¤×®½×Ø-+®H¤+³÷++®ɗ

Wypróbuj online!

Wyjaśnienie

                   Inputs: s and f
×÷+                (s×f)÷(s+f)
    1.96²©HH¤      (© ← 1.96²)÷4      (call this W)

   +                         (s×f)÷(s+f)+W
             ×®             ((s×f)÷(s+f)+W)ש
               ½      sqrt[ ((s×f)÷(s+f)+W)ש ]   (call this R)

                ×Ø-            [   -R,      +R  ]
                   +®H¤        [©/2-R,   ©/2+R  ]
                       +³      [©/2-R+s, ©/2+R+s]

                         ÷           Divide both by:
                          ++®ɗ       (s+f)+©

Uwaga

Niektóre z tych funkcji są nowsze niż wyzwanie. Wierzę, że w czasie, gdy to wyzwanie zostało opublikowane, ++®¶×÷++1.96²©HH¤×®½×-,1+®H¤+³÷çbyła ważna Jelly (32 bajty), brakowało ɗi Ø-.

Lynn
źródło
1

APL (NARS), 49 znaków, 98 bajtów

{k←1.9208⋄(2+n÷k)÷⍨(1+⍺÷k)+¯1 1×√1+2×⍺×⍵÷k×n←⍺+⍵}

test

  f←{k←1.9208⋄(2+n÷k)÷⍨(1+⍺÷k)+¯1 1×√1+2×⍺×⍵÷k×n←⍺+⍵}
  25 f 75
0.17545094 0.3430464637 
  0 f 1
0 0.7934567085 
  1 f 0
0.2065432915 1 
RosLuP
źródło