Calcola l'intervallo del punteggio Wilson


15

L' intervallo del punteggio Wilson è un intervallo di confidenza della probabilità di successo, basato sulla percentuale di successi in una serie di prove di Bernoulli (una prova di Bernoulli è una prova in cui sono possibili esattamente due esiti: successo o fallimento ). L'intervallo è dato dalla seguente formula:

Intervallo di Wilson

I due valori forniti dalla formula sono i limiti superiore e inferiore dell'intervallo. n S e n F sono il numero di successi e insuccessi, rispettivamente, e n è il numero totale di prove (equivalente a n S + n F ). z è un parametro dipendente dal livello di confidenza desiderato. Ai fini di questa sfida, verrà utilizzato z = 1,96 (corrispondente a un intervallo di confidenza del 95%) 1 .

Dati interi non negativi n S e n F , emettono i limiti dell'intervallo del punteggio Wilson.

Regole

  • Gli output devono essere il più precisi possibile rispetto ai valori reali, entro i limiti dell'implementazione in virgola mobile della propria lingua, ignorando qualsiasi potenziale problema dovuto a inesattezze aritmetiche in virgola mobile. Se la tua lingua è in grado di eseguire l'aritmetica a precisione arbitraria, deve essere precisa almeno quanto l'aritmetica a doppia precisione IEEE 754.
  • Gli input saranno compresi nell'intervallo rappresentabile per il tipo intero nativo della tua lingua e gli output saranno all'interno dell'intervallo rappresentabile per il tipo nativo in virgola mobile della tua lingua.
  • n sarà sempre positivo.
  • L'ordine delle uscite non ha importanza.

Casi test

Formato: 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. Il zvalore è il 1-α/2quantile della distribuzione normale standard, dove αè il livello di significatività. Se si desidera un intervallo di confidenza al 95%, il livello di significatività è α=0.05e il zvalore è 1.96.

Correlati: Problema con la pistola più veloce in Occidente . Stavo per renderlo una sfida, ma credo che tu mi abbia battuto. : /
mbomb007,

Risposte:


6

Mathematica, 48 byte (codifica UTF-8)

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

Funzione senza nome che accetta due argomenti nell'ordine n_s, n_fe restituisce una coppia ordinata di numeri reali. Il simbolo a tre byte , che rappresenta la funzione radice quadrata, è U-221A.

Utilizza il fatto che precedendo ##un numero si ottiene il prodotto dei due argomenti, mentre si +##ottiene la loro somma. Utilizza anche il fatto che i prodotti e le somme passano automaticamente sugli elenchi, in modo da {-1,1}√(...)implementare il ± nella formula. La definizione della costante s = z^2anziché di zse stessa ha anche salvato un paio di byte. (Principalmente sono solo orgoglioso di salvare un byte notando che 1.4^4è esattamente 1.96^2!)


Mathematica può usare codifiche arbitrarie? Il simbolo della radice quadrata è 1 byte in molte codifiche a byte singolo.
Mego

Può effettivamente utilizzare molte codifiche, ad esempio Mac OS Roman, che ha la proprietà di cui parli. La mia comprensione, tuttavia, è che avrei bisogno di includere i byte necessari per passare a una codifica non predefinita, che in questo caso è superiore ai 2 byte "sprecati".
Greg Martin

Oh, richiede un interruttore della riga di comando (o qualche chiamata di funzione)? Schifoso.
Mego

4
Mathematica è una meravigliosa giustapposizione di fantastico e disgustoso: D
Greg Martin

3

Perl 6 , 66 byte

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

Questa funzione restituisce effettivamente una giunzione or del limite inferiore e superiore; ad esempio, se chiamato con gli argomenti 100 e 0, restituisce:

any(0.963005192523998, 1)

È un formato di output non tradizionale per non dire altro, ma non è stato specificato alcun formato particolare ed entrambi i valori richiesti sono presenti.


Questo mi sembra perfetto. La mancanza di uno specifico formato di output era intenzionale: richiedere un formato specifico per l'output offre vantaggi ad alcune lingue e complica inutilmente la sfida. Finché entrambi i valori di output sono presenti in una forma utilizzabile, è accettabile.
Mego

3

05AB1E , 34 byte

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

L'input è del modulo L' [n_s, n_f]
output è del modulo[upper, lower]

Provalo online!

Spiegazione

"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

3

Incantesimi runici , 105 byte

#StillBetterThanJava

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

Provalo online!

L'input è nella forma L' n_s n_f
output è nella forma lower uppere ha uno spazio finale

AH DIO questo è un casino. Ecco la versione da scartare:

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

Tutti questi messaggi ydevono rallentare il secondo IP in modo che arrivi al Tpunto di trasferimento al momento giusto (cioè secondo). In questo modo i primi 3 elementi di un puntatore vengono spostati sull'altro (l'impostazione di questa azione è illustrata di seguito). 'Ä1C,genera zdividendo il carattere 196 per 100 (dup, quadrato, dup, div 2, dup, div 2 ...). Tutto il resto è solo una manciata di matematica e manipolazione dello stack per spingere i valori futuri nello stack fino a quando non sono necessari. Per la maggior parte, finiscono nell'ordine giusto ed è solo fino a quando r4s{++}non dobbiamo invertire lo stack e ruotare il tutto per ottenere i valori che vogliamo uno accanto all'altro.

Probabilmente c'è spazio per miglioramenti, ma è abbastanza complesso da non riuscire a vederlo. Heck, aveva inavvertitamente leggere "z" invece di "n" nella formula originale in un punto e fissaggio che era agitato.

Ho dovuto estrarre le note e simulare le pile per assicurarmi che fosse corretto:

Stack Funtimes

Ognuno ha un valore su entrambe le estremità a causa del numero di variabili (ad es. Ne avrei una con S e una con F, le farei scoppiare entrambe, capovolgerei una e aggiungerei la S + F che era su l'altra estremità in cima alla pila). Puoi vedere una delle sqrt(...)carte che ha un Sbordo inferiore.


3

R , 58 53 51 49 41 byte

-15 byte grazie a J.Doe. -2 byte grazie a Giuseppe.

function(x,y)prop.test(t(c(x,y)),cor=F)$c

1
Mi piace quando R è competitivo con le lingue del golf ...
J.Doe,



2

APL (Dyalog Unicode) , 50 byte

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

Provalo online!

nSnf .

Grazie a H.PWiz e dzaima per l'aiuto.

Come:

                                        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²


@ Adám Non è né un'espressione, né un programma completo, ma potresti renderlo un'espressione inizializzando zal suo utilizzo più giusto: ...÷z+(z←1.908)++per lo stesso conteggio dei byte. Inoltre: ⊣×⊢÷+->×÷+
ngn

1
@ngn Giusto, ma in realtà, questo è consentito dal doppio meta consenso: (1) e (2) .
Adám,

1

Python, 79 67 byte

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

L'output è un numero intero complesso con l'intervallo memorizzato come parte reale / immaginaria.


1

dc , 71 byte

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

Accetta entrambi gli input su due righe separate al momento dell'invocazione e output su due righe separate con il limite superiore in basso e il limite inferiore in alto .

Per esempio:

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

1

Racchetta 134 byte

(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))))

Ungolfed:

(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)))))

test:

(g 1 10)

Produzione:

0.016231752262825982
0.3773646254862038

1

Java 7, 130 byte

golfed:

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)};}

Ungolfed:

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) };
}

Provalo online

Restituisce una matrice di tipo double di lunghezza 2, probabilmente può essere giocata più a golf.


1

> <> con -vflag, 100 byte

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

Si aspetta che l'input sia presente nello stack all'avvio dell'esecuzione, nell'ordine n_s, n_f. Provalo online!

Che linguaggio stupido tentare questo in ...

Poiché> <> manca di un esponente o di un operatore root, la radice quadrata viene calcolata nella seconda riga di codice usando il metodo Babylonian , con una precisione di 1e-8- per ogni esempio che ho provato, questo è accurato con almeno 10 decimali. Se ciò non è abbastanza preciso, i limiti possono essere ridotti aggiungendo altro :*nella seconda riga, mescolando le cose per mantenere gli specchi in linea.

L'output è nella forma seguente:

<lower bound>
<upper bound>

1

Pyth, 38 byte

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

L'ingresso è come un elenco di valori, [n_s, n_f]. L'output è [upper, lower]Provalo online qui o verifica tutti i casi di test contemporaneamente qui .

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)

1

Gelatina , 30 byte

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

Provalo online!

Spiegazione

                   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)+©

Nota

Alcune di queste funzionalità sono più recenti della sfida. Credo che nel momento in cui questa sfida è stata pubblicata, ++®¶×÷++1.96²©HH¤×®½×-,1+®H¤+³÷çera valida Jelly (32 byte), carente ɗe Ø-.


1

APL (NARS), 49 caratteri, 98 byte

{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 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.