2017-01-24 6 views
2

저는 PK 모델링과 pymc3에 익숙하지 않지만 pymc3을 가지고 놀았으며 간단한 PK 모델을 자체 학습의 일부로 구현하려고합니다. 구체적으로는이 관계를 캡처하는 모델 ...PyMC3 PK 모델링. 데이터 모델을 만드는 데 사용 된 매개 변수로 모델을 만들 수 없습니다.

Simple pk

C (t) (Cpred)는 시간 t에서의 농도는, 투여 량은 소정 용량이이 V는 분포의 양이며, CL은 간극이다.

3 회 복용량 100,200,300에 대해 CL = 2, V = 10의 값을 가진 일부 테스트 데이터 (30 명)를 생성했으며, 0,1,2,4,8,12의 시점에 데이터를 생성했으며 CL (정규 분포, 0 평균, 오메가 = 0.6) 및 잔여 설명 불능 오류 DV = Cpred + sigma에 대한 임의의 오류. 여기서 시그마는 정상적으로 SD = 0.33으로 분포합니다. 또한 나는 C와 V에 가중치 (균일 분포 50-90)에 대한 변환을 포함 시켰습니다. CLi = CL * WT/70; Vi = V * WT/70이다. 내가 pymc3에서 간단한 모델을 구축

# Prepare data from df to model specific arrays 
time = np.array(df['time']) 
dose = np.array(df['dose']) 
DV = np.array(df['DV']) 
WT = np.array(df['WT']) 
n_patients = len(data['subject'].unique()) 
subject = data['subject'].values-1 

모델의 배열이 준비 만들기

# Create Data for modelling 
np.random.seed(0) 
# Subject ID's 
data = pd.DataFrame(np.arange(1,31), columns=['subject']) 
# Dose 
Data['dose'] = np.array([100,100,100,100,100,100,100,100,100,100, 
        200,200,200,200,200,200,200,200,200,200, 
        300,300,300,300,300,300,300,300,300,300]) 
# Random Body Weight 
data['WT'] = np.random.randint(50,100, size =30) 
# Fixed Clearance and Volume for the population 
data['CLpop'] =2 
data['Vpop']=10 
# Error rate for individual clearance rate 
OMEGA = 0.66 
# Individual clearance rate as a function of weight and omega 
data['CLi'] = data['CLpop']*(data['WT']/70)+ np.random.normal(0, OMEGA) 
# Individual Volume as a function of weight 
data['Vi'] = data['Vpop']*(data['WT']/70) 

# Expand dataframe to account for time points 
data = pd.concat([data]*6,ignore_index=True) 
data = data.sort('subject') 
# Add in time points 
data['time'] = np.tile(np.array([0,1,2,4,8,12]), 30) 

# Create concentration values using equation 
data['Cpred'] = data['dose']/data['Vi'] *np.exp(-1*data['CLi']/data['Vi']*data['time']) 
# Error rate for DV 
SIGMA = 0.33 
# Create Dependenet Variable from Cpred + error 
data['DV']= data['Cpred'] + np.random.normal(0, SIGMA) 

# Create new df with only data for modelling... 
df = data[['subject','dose','WT', 'time', 'DV']] 

... ...

pk_model = Model() 

with pk_model: 
    # Hyperparameter Priors  
    sigma = Lognormal('sigma', mu =0, tau=0.01) 

    V = Lognormal('V', mu =2, tau=0.01) 
    CL = Lognormal('CL', mu =1, tau=0.01)  

    # Transformation wrt to weight 
    CLi = CL*(WT)/70  
    Vi = V*(WT)/70 

    # Expected value of outcome 
    pred = dose/Vi*np.exp(-1*(CLi/Vi)*time) 

    # Likelihood (sampling distribution) of observations 
    conc = Normal('conc', mu =pred, tau=sigma, observed = DV) 

내 기대 내가 할 수 있었어야했다 데이터를 생성하는 데 원래 사용 된 상수 및 오류 비율을 데이터에서 확인하는 것이지만, 그렇게 할 수는 없지만 가까이 갈 수는 있습니다. 이 예에서 ...

data['CLi'].mean() 
> 2.322473543135788 
data['Vi'].mean() 
> 10.147619047619049 

그리고 추적
  1. 내 코드가 제대로 구성하고있다가 ..

    Traceplot

    그래서 내 질문은 .... 보여주고있다 내가 간과 한 눈부신 실수가이 차이를 설명 할 수 있습니까?
  2. 데이터를 생성 한 관계를보다 잘 반영하도록 pymc3 모델을 구성 할 수 있습니까?
  3. 모델 개선을위한 제안 사항은 무엇입니까?

미리 감사드립니다.

답변

2

나는 내 자신의 질문에 대답 할 것입니다!

하지만 여기에있는 예를 들어 다음과 같은 계층 적 모델을 구현 ...

GLM -hierarchical

그것은 치료를 작동합니다. 또한 나는 내가 dataframe에 오류를 적용 한 방법으로 오류를 발견 - 각 과목을 보장하기 위해

data['CLer'] = np.random.normal(scale=OMEGA, size=30) 

를 사용해야하는 것은 오류

에 대해 다른 값을 갖는다