2016-12-20 3 views
0

1 개의 공유 매개 변수와 6 개의 다른 매개 변수를 사용하여 전역 적합을 시도합니다. dataComplete는 텍스트 파일에서 파싱 된 내 데이터이며 dose = x 값입니다. 여기서 bValue는 농도마다 변하고 다른 변수는 동일하게 유지됩니다. 전역 적으로 맞추기 전에 매개 변수를 사용하여 계산이 이루어집니다. 잘못 입력 : 유모 값과 2 : 형식 오류 나는 두 가지 오류Python, Lmfit, globalfit

1을 얻을 N = 35, M은 = 22

내가 개별 요소를 확인 초과하지 않아야하고는 제대로 작동 있지만 글로벌 맞습니다. 어떤 도움을 많이 주시면 감사하겠습니다. 이전에 해결 된 예제에서 코드를 사용하려고했지만 분명히 잘못된 것이 있습니다.

##file parser 
## coded elsewhere 

dataComplete = [[90.47, 91.6, 89.83, 68.58, 56.68, 41.93, 1.09, 17.0, 9.19, 1.84, 0.1, 0.38, -0.37, 0.47, 0.65, -0.01, 0.36, 0.18, 0.29, 0.12, 0.87, -1.26], [108.07, 115.49, 102.48, 104.09, 110.15, 72.64, 49.11, 37.35, 24.94, 14.33, 6.31, 3.07, 9.81, 0.2, 0.74, 0.59, 1.11, 0.44, 0.34, 1.03, 0.06, 1.08], [100.93, 118.82, 89.76, 116.32, 127.06, 97.5, 69.71, 47.17, 44.16, 22.15, 18.6, 9.64, 2.56, 2.02, 0.93, 0.29, 1.11, -0.04, 0.27, -0.23, 1.0, 0.18], [99.87, 110.15, 92.21, 92.59, 96.8, 92.69, 81.39, 70.09, 44.08, 39.48, 7.66, 21.49, 2.96, 5.04, 1.87, 2.49, 1.26, 0.53, 0.65, 0.97, 1.15, 0.52], [102.14, 97.94, 94.85, 94.48, 101.22, 94.81, 111.42, 94.96, 61.2, 33.17, 29.37, 11.33, 23.67, 15.97, 6.52, 2.4, 2.29, 0.27, 0.08, 0.31, 0.09, -0.09]] 

dose = [-5.0, -5.30103, -5.60206, -5.90309, -6.20412, -6.50515, -6.80618, -7.10721, -7.40824, -7.70927, -8.0103, -8.31133, -8.61236, -8.91339, -9.21442, -9.51545, -9.81648, -10.11751, -10.41854, -10.71957, -11.0206, -11.32163] 



def objective(params,xdata,ydata): 
    resid = 0.0*ydata[:] 
    for i in range(5): 
     logEc50 = 10**(params['logEc50_%i' %(i+1)].value) 
     bValue = params['bValue_%i' %(i+1)].value 
     pA2 = params['pA2_%i' %(i+1)].value 
     schildSlope = params['schildSlope_%i' %(i+1)].value 
     top = params['top_%i' %(i+1)].value 
     bottom = params['bottom_%i' %(i+1)].value 
     hillSlope = params['hillSlope_%i' %(i+1)].value 

     ec50 = 10**(logEc50) 
     Antag = 1+(bValue/(10**(-1*pA2)))**schildSlope 
     LogEC=np.log((ec50*Antag)) 

     resid[i, :] =bottom + (top-bottom)/(1+10**((LogEC-dose)*hillSlope)) 
    return resid[i, :] - ydata[i, :] 


params = Parameters() 
molar = [1.25e-7,2.5e-8,1e-8,5e-9,0] 

for i in range(5): 
    params.add('logEc50_%i' % (i+1),value=-6.96) 
    params.add('bValue_%i' % (i+1),value=molar[i]) 
    params.add('pA2_%i' % (i+1),value=7.48) 
    params.add('schildSlope_%i' % (i+1),value=1) 
    params.add('bottom_%i' % (i+1),value=-0.2) 
    params.add('top_%i' % (i+1),value=109.496) 
    params.add('hillSlope_%i' % (i+1),value=1) 


#data 
dataComplete = [[]]*5 
dataComplete[0]=conc1 
dataComplete[1]=conc2 
dataComplete[2]=conc3 
dataComplete[3]=conc4 
dataComplete[4]=conc5 


print dataComplete 
dataComplete = np.array(dataComplete) 
assert(dataComplete.shape) ==(5,22) 

#x data 
dose = np.array(dose) 

#fitting 
result = minimize(objective,params,args=(dose,dataComplete)) 

lmfit.printfuncs.report_fit(result.params) 
+0

오류를 알았습니다. TypeError : 부적절한 입력 : N = 35는 M = 22를 초과하면 안됩니다. – user2332994

답변

0

나는 10s의 많은 권한과 숫자로 문제를 해결할 것입니다.

ec50 = 10**(logEc50) 

(즉를 두 번 만하고있다 : 예를 들어,

logEc50_i ~= 7 

당신은 다음 전원 10-는 것을 인상

logEc50 = 10**(params['logEc50_%i' %(i+1)].value) 

으로 전원 (10)에 그 인상 실수?)

그런 다음을 곱하면됩니다. 두 숫자의 비율이 ~ 1E-7 다음 단결에 가까운 무언가 결과,해야하고 그 로그 걸릴 것입니다:

LogEC=np.log((ec50*Antag)) 

난 당신이 정말

같은 대수의 속성을 사용하려는 생각
log(a*b) = log(a) + log(b) 
log(x**y) = y*log(x) 

여기서 수치 적 불안정성을 방지합니다.

데이터 집합간에 어떤 매개 변수가 공유되는지 알지 못했지만 5 개의 개별 데이터 집합을 각각 7 개의 변수로 채우려는 것처럼 보입니다.이 중 하나는 동일하게 제한됩니다. 모든 데이터 세트의 가치? 총 22 회의 관측치 만이 35 개 변수인지 31 개 변수인지에 상관없이 많은 변수에 부합하는 전체 관찰이 충분하지 않습니다.

하지만 5 개의 데이터 세트 각각에 대해 22 개의 관측치가있는 것처럼 보입니다. 나는 당신이 각각의 데이터 집합에 대해 잔차를 평가할 필요가 있고 그 다음에 을 연결하여 결과가이되도록 5 개의 모든 데이터 집합에 대한 재 배열에 110 개의 요소가 포함되어 있어야한다고 생각합니다.

+0

맞습니다. 저는 총 110 개에 대해 5 개의 데이터 세트/22 개의 obs를 가지고 있습니다. 위의 수학을 무시하면 매개 변수 7 개, 6 개는 공유되고 1 개는 공유되지 않습니다. 이 변경 방법 : result = minimize (objective, params, args = (dose, dataComplete)) dataComplete가 5x22 행렬이라고 가정합니다. 그런 다음 공유되지 않은 매개 변수에 값을 할당하는 코드를 파악할 수 있습니다. 반복할까요? 시간 내 주셔서 감사합니다. – user2332994

+0

나는 옛 대답 중 하나를 따라 갔다. M. 뉴빌과 나는 내가 원하는 것을 얻었고, 연결된 잔여 물을 반환했다고 생각한다. 고맙습니다. – user2332994