Обчисліть інтервал балів Вілсона


15

Вілсон оцінка інтервал є довірчим інтервалом ймовірності успіху, грунтуючись на частці успіхів в наборі випробувань Бернуллі (випробування Бернуллі є дослідженням , в якому рівно два результату можливий: успіх або невдача ). Інтервал задається наступною формулою:

Інтервал Вілсона

Два значення, задані формулою, - це верхня і нижня межі інтервалу. n S і n F - кількість успіхів і невдач відповідно, і n - загальна кількість випробувань (еквівалентна n S + n F ). z - параметр, що залежить від бажаного рівня впевненості. Для цілей цього виклику буде використано z = 1,96 (що відповідає 95% довірчому інтервалу) 1 .

Враховуючи невід’ємні цілі числа n S і n F , виведіть межі шкали інтервалу Вілсона.

Правила

  • Виходи повинні бути максимально точними до справжніх значень, в межах реалізації плаваючої крапки вашої мови, ігноруючи будь-які потенційні проблеми через арифметичні неточності з плаваючою комою. Якщо ваша мова здатна до арифметики довільної точності, вона повинна бути принаймні такою ж точною, як арифметика подвійної точності IEEE 754.
  • Вхідні дані будуть знаходитись у межах репрезентативного діапазону для цілочисельного типу вашої мови, а виходи - у межах репрезентативного діапазону для рідного типу плаваючої крапки вашої мови.
  • n завжди буде позитивним.
  • Порядок виходів не має значення.

Випробування

Формат: 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. zЗначення є 1-α/2й квантиль стандартного нормального розподілу, де αзнаходиться рівень значимості. Якщо ви хочете 95-відсотковий інтервал довіри, ваш рівень значущості α=0.05, а zзначення - 1.96.

Пов'язане: Найшвидша зброя на заході . Я збирався зробити це викликом, але, мабуть, ти перебив мене до цього. : /
mbomb007

Відповіді:


6

Математика, 48 байт (кодування UTF-8)

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

Безіменна функція, яка бере два аргументи в порядку n_s, n_fі повертає впорядковану пару дійсних чисел. Трибайтовий символ , що представляє функцію квадратного кореня, - U-221A.

Використовує той факт, що попереднє ##число призводить до добутку двох аргументів, тоді як +##приводить до їх суми. Також використовується той факт, що продукти та суми автоматично переносять список у списки, щоб {-1,1}√(...)реалізувати ± у формулі. Визначення константи s = z^2замість zсебе також заощадило пару байт. (Здебільшого я пишаюся тим, що врятував байт, помітивши 1.4^4саме це 1.96^2!)


Чи може Mathematica використовувати довільні кодування? Символ квадратного кореня - 1 байт у безлічі однобайтових кодувань.
Мего

Він дійсно може використовувати багато кодувань - наприклад, Mac OS Roman, який має вказане вами властивість. Я розумію, що мені потрібно включити байти, необхідні для переходу на кодування за замовчуванням, що в цьому випадку більше, ніж 2 "витрачені" байти.
Грег Мартін

О, для цього потрібен комутатор командного рядка (або якийсь виклик функції)? Валовий.
Мего

4
Математика - це чудова супозиція дивовижних і грубих: D
Грег Мартін

3

Perl 6 , 66 байт

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

Ця функція фактично повертає або-перехід нижньої та верхньої меж; наприклад, якщо викликається з аргументами 100 і 0, він повертає:

any(0.963005192523998, 1)

Як мінімум, це нетрадиційний вихідний формат, але конкретний формат не вказаний, і обидва необхідних значення є.


Мені це здається прекрасним. Відсутність конкретного вихідного формату була навмисною - необхідність певного формату для виведення дає переваги деяким мовам, і це зайво ускладнює завдання. Поки обидва вихідні значення присутні в певній використаній формі, це прийнятно.
Мего

3

05AB1E , 34 байти

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

Введення форми [n_s, n_f]
Вихід має форму[upper, lower]

Спробуйте в Інтернеті!

Пояснення

"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

Рунічні чари , 105 байт

#StillBetterThanJava

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

Спробуйте в Інтернеті!

Вхід має форму n_s n_f
Вихід має форму lower upperта має пробіл

АХ БОГ, це безлад. Ось розгорнута версія:

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

Всі yвони повинні уповільнити другий IP, щоб він надійшов у Tточку переказу в потрібний час (тобто секунду). Це пересуває 3 найкращі елементи одного вказівника на інший (налаштування на цю дію зображено нижче). 'Ä1C,породжує zділенням символу 196 на 100 (дуб, квадрат, дуб, дів 2, дуб, дів 2 ...). Все інше - це лише купа математики та маніпуляцій стеком, щоб перемістити майбутні значення вниз по стеку, поки вони не знадобляться. Здебільшого вони закінчуються в правильному порядку і лише тоді, коли r4s{++}нам доведеться повернути стек і повернути всю річ, щоб отримати потрібні нам значення один біля одного.

Напевно, є місце для вдосконалення, але його достатньо складний, що я його не бачу. Хек, випадково прочитав "z" замість "n" в початковій формулі в один момент і виправив, що це було грубо.

Мені довелося витягувати блокноти та імітувати стеки, щоб переконатися, що це правильно:

Stack Funtimes

Кожна з них має значення з обох кінців через те, скільки змінних було (наприклад, я мав би одну з S і одну з F, я би їх обидва, перевернув один навколо і додав S + F, який був на інший кінець до вершини стека). Ви можете бачити, що одна з sqrt(...)карток має Sнижню кромку.





2

APL (Dyalog Unicode) , 50 байт

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

Спробуйте в Інтернеті!

Infix Dfn, беручи нс і нf.

Дякуємо H.PWiz та dzaima за допомогу.

Як:

                                        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 Це ні вираз, ні повна програма, але ви можете зробити це виразом, ініціалізуючи zйого в найкоротшій кількості: ...÷z+(z←1.908)++для того ж байта. Також: ⊣×⊢÷+->×÷+
ngn

1
@ngn Право, але насправді це дозволено подвійним мета-консенсусом: (1) та (2) .
Adám

1

Пітон, 79 67 байт

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

Вихід - це складне ціле число з інтервалом, що зберігається як реальна / уявна частина.


1

dc , 71 байт

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

Бере обидва входи у двох окремих рядках після виклику та виводить на два окремих рядки з верхньою межею на нижній та нижньою межею вгорі .

Наприклад:

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

Ракетка 134 байти

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

Безголівки:

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

Тестування:

(g 1 10)

Вихід:

0.016231752262825982
0.3773646254862038

1

Java 7, 130 байт

Гольф:

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

Безголівки:

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

Спробуйте в Інтернеті

Повертає масив типу подвійний довжиною 2, можливо, може бути більше гольфу.


1

> <> з -vпрапором, 100 байт

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

Очікує, що вхід буде присутній у стеку при запуску виконання, в порядку n_s, n_f. Спробуйте в Інтернеті!

Яка дурна мова намагатися це зробити ...

Оскільки> <> не вистачає експонента або кореневого оператора, квадратний корінь обчислюється у другому рядку коду за допомогою вавілонського методу з точністю 1e-8- для кожного прикладу, який я намагався, це точно як мінімум 10 знаків після коми. Якщо це недостатньо точно, межі можна посилити, додавши більше:* у другий рядок, перетасовуючи речі, щоб зберегти дзеркала.

Вихід складається у такій формі:

<lower bound>
<upper bound>

1

Pyth, 38 байт

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

Введення як список значень, [n_s, n_f]. Вихід: [upper, lower]Спробуйте це в Інтернеті тут або перевірити всі тестові випадки тут .

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

Желе , 30 байт

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

Спробуйте в Інтернеті!

Пояснення

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

Примітка

Деякі з цих особливостей новіші, ніж виклик. Я вірю, що до того часу, як цей виклик був опублікований, ++®¶×÷++1.96²©HH¤×®½×-,1+®H¤+³÷çбуло дійсним Jelly (32 байти), не вистачає ɗі Ø-.


1

APL (NARS), 49 символів, 98 байт

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

тест

  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 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.