윌슨 점수 간격 계산


15

윌슨 점수 간격 베르누이 실험 세트에서의 성공 비율에 기초하여 성공 확률의 신뢰 구간이며, (a 베르누이 시행 정확히 두 개의 결과들이 가능하는 시험이다 : 성공 또는 실패 ). 간격은 다음 공식으로 제공됩니다.

윌슨 간격

공식에 의해 주어진 두 값은 구간의 상한과 하한입니다. n Sn F 는 각각 성공 및 실패 횟수이고 n 은 총 시행 횟수입니다 ( n S + n F 와 동일 ). z 는 원하는 신뢰 수준에 따른 매개 변수입니다. 이 문제를 해결하기 위해 z = 1.96이 사용됩니다 (95 % 신뢰 구간에 해당) 1 .

음수가 아닌 정수 n Sn F가 주어지면 Wilson 점수 간격의 경계를 출력합니다.

규칙

  • 출력은 부동 소수점 산술 부정확성으로 인한 잠재적 문제를 무시하고 언어의 부동 소수점 구현 한계 내에서 가능한 실제 값에 대해 정확해야합니다. 귀하의 언어가 임의의 정밀 산술을 할 수있는 경우, 최소한 IEEE 754 배정 밀도 산술만큼 정확해야합니다.
  • 입력은 언어의 고유 정수 유형에 대해 표현 가능한 범위 내에 있고 출력은 언어의 고유 부동 소수점 유형에 대해 표현 가능한 범위 내에 있습니다.
  • 은 항상 양수입니다.
  • 출력 순서는 중요하지 않습니다.

테스트 사례

체재: 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

Mathematica, 48 바이트 (UTF-8 인코딩)

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

이름 기능은 순서대로 두 개의 인수를 복용 n_s, n_f하고 실수의 순서쌍을 반환. 제곱근 함수를 나타내는 3 바이트 기호 는 U-221A입니다.

##숫자 가 앞에 오면 두 인수의 곱이 +##나오고 그 결과는 합이됩니다. 또한 제품과 합계가 목록에 자동으로 스레드 {-1,1}√(...)되어 수식에서 ± 를 구현 한다는 사실을 사용합니다 . 자체 s = z^2대신 상수 를 정의하면 z몇 바이트가 절약되었습니다. (대개 나는 그것이 1.4^4정확히 임을 주목함으로써 바이트를 절약하는 것을 자랑스럽게 생각 합니다 1.96^2!)


Mathematica가 임의의 인코딩을 사용할 수 있습니까? 제곱근 기호는 많은 단일 바이트 인코딩에서 1 바이트입니다.
Mego

실제로 언급 한 속성이있는 Mac OS Roman과 같은 많은 인코딩을 사용할 수 있습니다. 그러나 내 이해는 기본이 아닌 인코딩으로 전환하는 데 필요한 바이트를 포함해야한다는 것입니다.이 경우 2 "낭비"바이트 이상입니다.
Greg Martin

아, 커맨드 라인 스위치 (또는 함수 호출)가 필요합니까? 심한.
Mego

4
Mathematica는 굉장하고 총체적인 훌륭한 병치입니다 : D
Greg Martin

3

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

가장 작게 말하면 비 전통적인 출력 형식이지만 특정 형식이 지정되지 않았으며 필요한 값이 모두 있습니다.


이것은 나에게 잘 보인다. 특정 출력 형식의 부족은 의도적이었습니다. 출력에 특정 형식을 요구하면 일부 언어에 이점이 생겨 불필요하게 문제가 복잡해집니다. 두 출력 값이 사용 가능한 형식으로 존재하는 한 허용됩니다.
Mego

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이며 뒤에 공백이 있습니다.

AH GOD 이것은 엉망입니다. 래핑되지 않은 버전은 다음과 같습니다.

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

이 모든 것들은 y두 번째 IP 속도를 T늦춰서 적절한 시점 (즉, 두 번째)에 랜스 퍼 지점에 도달하도록합니다 . 이것은 하나의 포인터의 상위 3 개 항목을 다른 하나의 포인터로 밀어 넣습니다 (이 작업에 대한 설정은 아래에 나와 있습니다). 문자 196을 100으로 나누어 'Ä1C,생성 z합니다 (dup, square, dup, div 2, dup, div 2 ...). 그 밖의 모든 것들은 필요할 때까지 미래의 가치를 쌓아 올리는 수학 및 스택 조작입니다. 대부분의 경우 올바른 순서로 끝나고 r4s{++}스택을 뒤집고 원하는 것을 서로 옆에있는 값을 얻으려면 전체를 회전시켜야합니다.

아마도 개선의 여지가 있지만, 그것을 볼 수 없을 정도로 복잡합니다. 하, 의도 한 지점에 고정 일본어 식 "Z"대신에 "N"읽었다 거친 하였다.

올바른지 확인하기 위해 메모 카드를 꺼내고 스택을 시뮬레이션해야했습니다.

스택 펀 타임

모든 단일 변수는 변수의 수로 인해 양쪽 끝에 값이 있습니다 (예 : S와 F, 하나와 F, 둘 다 팝하고 둘 다 뒤집고 S + F를 추가하십시오) 다른 쪽 끝을 스택 상단으로). sqrt(...)카드 중 하나의 S아래쪽 가장자리가 있습니다.


3

R , 58 53 51 49 41 바이트

J.Doe 덕분에 -15 바이트 주세페 덕분에 -2 바이트.

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

1
좋아 나는 R은 ... 골프 언어와 경쟁력을 때
J.Doe



2

APL (Dyalog Unicode) , 50 바이트

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

온라인으로 사용해보십시오!

에스에프 합니다.

도와 주신 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

자바 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 인 double 형식의 배열을 반환합니다.


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 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.