2014-12-22 4 views
0

저는 PyMC를 처음 사용하고 간단한 조건부 확률 모델을 설정하려고합니다 : P(has_diabetes|bmi, race). 레이스는 0-4로 인코딩 된 5 개의 이산 값을 취할 수 있으며 BMI는 0이 아닌 양의 실수를 취할 수 있습니다. |PyMC의 관찰 데이터를 조건으로 연속 부모와 이산 어린이

을 : 나는처럼 보이는 데이터를 관찰

p_race = [0.009149232914923292, 
      0.15656903765690378, 
      0.019637377963737795, 
      0.013947001394700141, 
      0.800697350069735] 
race = pymc.Categorical('race', p_race) 

bmi_alpha = pymc.Exponential('bmi_alpha', 1) 
bmi_beta = pymc.Exponential('bmi_beta', 1) 
bmi = pymc.Gamma('bmi', bmi_alpha, bmi_beta, value=bmis, observed=True) 

: 지금까지이 같은 부모 변수 설정을 가지고 bmi | 경주 | has_diabetes |
| 21.7 | 1 | 0 |
| 45.3 | 4 | 1 |
| 18.9 | 2 | 0 |
| 26.6 | 0 | 0 |
| 35.1 | 4 | 0 |

은 나뿐만 has_diabetes 모델을 시도하고있다 :

has_diabetes = pymc.Bernoulli('has_diabetes', p_diabetes, value=data, observed=True) 

내 문제는 내가 그것을 race의 값과의 지속적인 가치에 의존하기 때문에 p_diabetes 기능을 구성하는 방법을 잘 모르겠습니다이다 bmi.

답변

2

예측 변수의 함수로 p_diabetes을 생성하는 결정 론적 함수를 만들어야합니다. 이렇게하는 가장 안전한 방법은로 직 선형 변환을 이용하는 것입니다. 예를 들면 다음과 같습니다.

intercept = pymc.Normal('intercept', 0, 0.01, value=0) 
beta_race = pymc.Normal('beta_race', 0, 0.01, value=np.zeros(4)) 
beta_bmi = pymc.Normal('beta_bmi', 0, 0.01, value=0) 

@pymc.deterministic 
def p_diabetes(b0=intercept, b1=beta_race, b2=beta_bmi): 

    # Prepend a zero for baseline 
    b1 = np.append(0, b1) 

    # Logit-linear model 
    return pymc.invlogit(b0 + b1[race] + b2*bmi) 

기준선이 가장 큰 그룹이됩니다 (이 예에서는 인덱스 0으로 가정 함).

실제로 모델의 첫 번째 부분이 무엇인지, 특히 예측 자 모델을 작성하는 이유는 분명하지 않지만 아마도 누락되었습니다.

+0

응답 해 주셔서 감사합니다. 로 직 선형 모델에 대한 간단한 질문이 있습니다. (beta_race = 0, 0.01, value = np.zeros (5))' – calstad

+0

대체품인데 왜 평행선을 기준선에서 샘플링하는 대신베이스 라인 레이스를 사용합니까? 매개 변수화. 사실, 당신은 단순히 각 종족에 대해 별도의 절편을 가질 수 있습니다. 이것은 각 종족 그룹 내의 카운트가 유사 할 경우 잘 작동합니다. 흔히 하나의 종족이 다른 종족보다 훨씬 더 자주 발생합니다.이 경우 내 매개 변수화가 더 잘 작동하는 경향이 있습니다. –

+0

의미가 있습니다. 감사! – calstad