2013-05-23 5 views
5

난 그냥 scikits를 통해 사용할 수있는 좋은 부트 스트랩 패키지를 시도하기 시작했습니다 부트 스트랩 : https://github.com/cgevans/scikits-bootstrap(파이썬) 추정 회귀 매개 변수 신뢰 구간은

하지만 난에 대한 신뢰 구간을 추정하기 위해 노력하고 문제가 발생했습니다 선형 회귀로부터의 상관 계수. 반환 된 신뢰 구간은 원래 통계의 범위를 벗어납니다. 여기

코드이다 :이 CI = -0.605, 0.644]의 결과를 산출

import numpy as np 
from scipy import stats 
import bootstrap as boot 

np.random.seed(0) 
x  = np.arange(10) 
y  = 10 + 1.5*x + 2*np.random.randn(10) 
r0 = stats.linregress(x, y)[2] 

def my_function(y): 
    return stats.linregress(x, y)[2] 

ci = boot.ci(y, statfunction=my_function, alpha=0.05, n_samples=1000, method='pi') 

하지만 원래 통계 R0 = 0.894이다.

저는 이것을 R에서 시도해 봤습니다. 거기서 잘 작동하는 것처럼 보입니다 : ci는 예상대로 r0를 걸치고 있습니다.

도와주세요!

답변

8

R 코드를 제공해 주시겠습니까?

여기서 문제는 y을 boot.ci로 전달한다는 것이지만, my_function을 실행할 때마다 원래의 x을 사용한다는 점이 문제입니다. my_function에 x 입력이 없음을 주목하십시오.) 부트 스트랩은 재 샘플링 된 데이터에 통계 함수를 적용하므로 원래 xy의 샘플을 사용하여 통계 함수를 적용하는 경우 무의미한 결과가 발생합니다. 이것이 BCA 메소드가 전혀 작동하지 않는 이유입니다. 즉, 동일한 수의 요소가없는 잭 나이프 샘플에는 통계 함수를 적용 할 수 없습니다.

샘플은 축 0 (행)을 따라 취해 지므로 여러 1D 배열을 통계 함수에 전달하려면 xy = vstack((x,y)).T 여러 열을 사용할 수 있으며 해당 열의 데이터를 가져 오는 statfunction을 사용하십시오. 당신의 모든 데이터와 장난 방지하기 위해 원하는 경우

def my_function(xysample): 
    return stats.linregress(xysample[:,0], xysample[:,1])[2] 

또는, 당신은 인덱스에 작동하는 함수를 정의 할 수 있고, 그럼 그냥 boot.ci하는 인덱스를 전달합니다

def my_function2(i): 
    return stats.linregress(x[i], y[i])[2] 

boot.ci(np.arange(len(x)), statfunction=my_function2, alpha=0.05, n_samples=1000, method='pi') 

주를이 이 경우 BCA 작동하므로, 백분율 간격을 실제로 사용하지 않는 한 method = 'bca'를 사용할 수도 있습니다. BCA는 거의 항상 더 좋습니다.

나는이 두 가지 방법 모두 이상적이지 않다는 것을 알고 있습니다. 솔직히, 나는 이런 식으로 여러 배열을 내 statfunction에 전달할 필요가 없었으며, 대다수의 사람들은 자신의 statfunction으로 mean을 사용했을 가능성이 높습니다. 여기에 가장 좋은 생각은 동일한 크기의 [0] 배열리스트가 전달되도록 허용하는 것일 수도 있습니다 (예 : boot.ci([x,y],...)). 그런 다음 이들 모두를 동시에 샘플링하여 statfunction에 별도의 인수로 전달하십시오. 이 경우 my_function(x,y) 일 수 있습니다. 내가이 일을 할 수 있는지 알 겠어.하지만 R 코드를 보여 주면 좋을 것 같아. 이걸 다루는 더 좋은 방법이 있는지 알고 싶다.


업데이트 :

scikits.bootstrap (v0.3.1)의 최신 버전에서

는, 배열의 튜플 제공 할 수 있으며, 그들로부터 샘플 statfunction에 별도의 인수로 전달됩니다. 또한, statfunction은 배열 출력을 제공 할 수 있으며 출력의 각 지점에 대한 신뢰 구간이 계산됩니다.따라서, 이것은 이제 매우 쉽게 할 수 있습니다. 다음은 linregress마다 출력 신뢰 구간을 제공한다 :이 경우

cis = boot.ci((x,y), statfunction=stats.linregress) 

cis[:,2] 원하는 신뢰 구간 것이다.

+0

훌륭한 반응을 보내 주셔서 감사합니다. R에서는 전체 데이터 구조 (심지어는 명시 적 모델)를 통계 계산 기능에 전달하여 비슷한 방식으로 구현 된 것으로 보입니다. http://www.statmethods.net/advstats/bootstrapping.html – ToddP

+3

감사합니다. 이것을 가져온다. 그건 그렇고, 당신이 스택 오버플로가 새로 생길 수도있는 것처럼 보입니다. 그래서 왼쪽에있는 체크 표시로 좋은 대답을 받아 들여 다른 사람들이 그 질문에 답을 얻었음을 알리는 것이 도움이된다고 언급해야한다고 생각했습니다. – cge

+0

@ user2269232 대답을 수락 할 수 있습니다. 한두 번의 클릭으로 아무도 죽이지 않을 것입니다 .... – rll