안녕하세요 여러분,
신뢰 구간에 대해 JSL에서 함수의 근을 어떻게 계산합니까?
JMP에서 구현되지 않은 신뢰 구간을 계산해야 하는 특별한 경우가 있습니다.
Wilks 정리를 사용하여 다음 함수의 근을 계산하여 신뢰 구간을 계산하려고 합니다.
f(x)=-2log(우도(x|데이터))-카이제곱 분위수(1-알파, 1).
여기서 x는 실수이고 데이터는 일변량 표본입니다.
사용할 수 있는 JSL 함수에 빌드가 있습니까? 아니면 적어도 비슷한 것?
웹이나 스크립팅 인덱스에서 아무 것도 찾을 수 없습니다.
몇 가지 제안을 해주시면 정말 감사하겠습니다.
미리 감사드립니다
위시리스트 토론에 이 제안을 추가하지 않으시겠습니까? 먼저 검색하여 다른 사람이 이미 제안했는지 확인하고 투표(쿠도)하십시오. 다른 사람이 없으면 고려를 위해 추가하십시오. 감사!
답변 해주셔서 감사합니다,
극한 상황에서는 최소화 기능이 조금 불안정한 것 같습니다.
그러나 귀하의 팁은 솔루션을 찾는 데 좋은 출발점이 되었습니다.
보다 돕다 대한 최소화() 기능. 당신의 표정은 Abs( -2log(우도(x|데이터))-카이제곱 분위수( 1-알파, 1) ). 이 수치 최적화는 근을 해결할 수 있어야 합니다. 가장 쉬운 방법은 스크립트 편집기를 사용하는 것입니다. 고르다 파일 > 새로 만들기 > 스크립트 . 마우스 오른쪽 버튼을 클릭하고 선택 포함된 로그 표시 . 이렇게 하면 함수 호출의 결과가 같은 창에 표시됩니다.
안녕하세요, @올리툰 -san, @rcast15 -san 및 @던타이거764 -san님,
저는 JMP Japan의 수석 테스터인 유스케 오노입니다. 제 영어 실력이 형편없다는 점을 미리 양해 부탁드립니다.
최대 우도 추정을 통해 추정된 일반 모델에서 프로파일 우도 신뢰 구간을 계산하려면 비선형 플랫폼을 사용하는 것이 좋습니다.
비거짓 플랫폼에서 이 기능을 사용하려면 손실 함수로 음의 로그 우도를 직접 지정해야 합니다. 데이터 테이블에서 손실 함수를 지정하면, 비선형 플랫폼은 [신뢰 한계] 버튼을 클릭하기만 하면 프로파일 우도 신뢰 한계를 자동으로 계산합니다.
[단계]
(1) JMP 데이터 테이블의 열에 Loss 공식을 지정합니다. 이 Loss 함수는 음의 로그 우도(= -LogLikelihood(theta|data))이며, 모델 매개변수는 공식에서 Parameter로 정의됩니다.
(2) [분석] > [특수모델링] > [비선형]을 선택합니다.
(3) [손실] 에 음의 대수 우도 함수가 포함된 열을 선택합니다.
[확인]을 클릭하세요.
(4) 보고서에서 [이동] 버튼을 클릭합니다.
(5) 필요한 경우 알파 값을 변경합니다.
필요한 경우 수렴 기준을 변경하세요.
Click
[신뢰 한계] button.
다음은 일표본 이항 분포에서 확률 모수에 대한 프로파일 우도 신뢰 구간을 계산하는 간단한 예시입니다. 공식에서 상수항(Log(_nC_k))을 삭제했습니다.
이 예시에서는 점수 구간(분포 플랫폼에 구현된 방법)이 프로파일 우도 구간보다 통계적으로 더 좋아야 합니다. 이 예시에서는 비선형 플랫폼을 사용하여 프로파일 우도 구간을 계산하는 방법만 보여줍니다.
dt = New Table( "Binomial Data",
New Column( "k", Values( [10] )),
New Column( "n", Values( [500] )),
New Column( "Negative Loglikehood",
Formula( Parameter( {p = 0.5}, -:k * Log( p ) - (:n - :k) * Log( 1 - p ) ) ),
)
);
dt << Nonlinear(
Loss( :Negative Loglikehood ),
CL Limit( 1e-15 ),
Loss is Neg LogLikelihood( 1 ),
Newton,
Finish,
Plot( 0 ),
Confidence Limits
);
다음 코드는 위 스크립트에서 계산된 상한값이 실제로 우리가 예상한 값인지 확인합니다.
p0 = 0.0348142211885808;
p1 = 0.02;
Show(ChisquareQuantile(0.95,1));
Show(2 *(Log(Binomial Probability(p1,500,10)) - Log(Binomial Probability(p0,500,10))));
/*
ChiSquare Quantile(0.95, 1) = 3.84145882069412;
2 * (Log(Binomial Probability(p1, 500, 10)) - Log(Binomial Probability(p0, 500, 10))) = 3.84145882069407;
*/
비선형 플랫폼은 모델에 두 개 이상의 모델 매개변수가 있는 경우에도 프로파일 우도 신뢰 구간을 계산할 수 있습니다.
또한 JMP와 JMP Pro의 일부 플랫폼은 프로파일 가능도 방법을 사용하여 신뢰 구간을 계산한다는 점에 유의하세요.
일반 방정식의 근을 계산하려는 경우, JMP에서 방정식을 푸는 방법은 방정식의 복잡성에 따라 달라집니다. JMP는 일반 방정식에 대한 일반 솔버를 제공하지 않습니다. 프로파일러가 일부 상황에서 유용할 수 있습니다. 목적 함수로 (f(x))^2를 지정하고 Minimize() JSL 함수나 비선형 플랫폼을 사용하면 합리적인 해를 얻을 수 있습니다. 또한, JMP 스크립팅 언어(JSL)를 사용하여 Regula-Falsi 방법, Ridders 방법 또는 Newton 방법의 특정 코드를 프로그래밍하는 것은 쉽지는 않지만, 그리 어렵지 않다고 생각합니다. 일반 방정식이 매우 복잡한 경우 JMP의 Python 코드를 사용하는 것이 더 나을 수 있습니다. JMP 18에서는 JMP에서 Python을 매우 원활하게 사용할 수 있습니다.
다음은 Regula-Falsi 방법과 Ridder 방법을 프로그래밍하는 매우 간단한 예입니다. JSL 함수를 다른 JSL 함수의 인수로 사용할 수도 있습니다. 다음 코드는 k = 10, n = 500인 이항 분포의 확률 모수에 대한 프로파일 우도 신뢰 구간을 계산합니다.
이 스크립트는 JSL로 알고리즘을 프로그래밍하는 것이 얼마나 어려운지 보여주기 위한 아주 간단한 샘플일 뿐입니다. 자세한 내용은 확인하지 않았으며, 다음 코드에는 오류 처리가 없습니다.
Names Default To Here(1);
/* Regula Falsi method */
/* https://en.wikipedia.org/wiki/Regula_falsi */
Regula Falsi = Function({f, data, x0, x2, tol=1e-8, niter = 1000}, {Default Local},
fx0 = f(x0, data);
fx2 = f(x2, data);
If(fx0 * fx2>0, Write("f(pl)*f(pu) should be less than zero"); Return(.));
For(i = 1, i <= niter, i++,
If(Abs(fx0)
<TOL>
0, fx0=fx1; x0=x1, fx1*fx2>0, fx2=fx1; x2=x1, Return(x1) ); ); Return(.); ); /* Ridders' method */ /* https://en.wikipedia.org/wiki/Ridders%27_method */ Ridders = Function({f, data, x0, x2, tol=1e-8, niter = 1000}, {Default Local}, fx0 = f(x0, data); fx2 = f(x2, data); If(fx0 * fx2>0, Write("f(pl)*f(pu) should be less than zero"); Return(.)); For(i = 1, i <= niter, i++, If(Abs(fx0)
<TOL>
0,1,fx0<0,-1, Retrun(x0)); x3 = x1 + (x1-x0) * sign fx0 * fx1 /Sqrt(fx1^2 - fx0*fx2); fx3 = f(x3, data); If( fx1*fx3 < 0, x0 = x1; fx0 = fx1; x2 = x3; fx2 = fx3; , fx3*fx0>0, fx0=fx3; x0=x3, fx3*fx2>0, fx2=fx3; x2=x3, Return(x3) ); ); Return(.); ); /* Solve for x to satisfy f(x, data) = 0 */ f = Function({p, data}, {Default Local}, k = data[1]; n = data[2]; chi = data[3]; p1 = k/n; 2*(k*Log(p1/p)+(n-k)*Log((1-p1)/(1-p))) - chi ); k = 10; n = 500; chi = Chisquare Quantile(1-0.05, 1); data = k||n||chi; /* Upper Confidence Limit */ pl = k/n; pu = 0.99999; ci up rf= Regula Falsi(NameExpr(f), data, pl, pu); ci up = Ridders(NameExpr(f), data, pl, pu); /* Lower Confidence Limit */ pl = 0.00001; pu = k/n; ci low rf= Regula Falsi(NameExpr(f), data, pl, pu); ci low = Ridders(NameExpr(f), data, pl, pu); Show(ci low rf||ci up rf); Show(ci low || ci up);
</TOL>
</TOL>
이 정보가 조금이라도 유용했으면 좋겠습니다.