0

1 つの共有パラメーターと 6 つの他のパラメーターを使用してグローバル フィットを実行しようとしています。dataComplete は、テキスト ファイルと線量 = x 値から解析された私のデータです。ここで、bValue は濃度ごとに変化し、他は同じままです。グローバル フィットを適用する前に、パラメーターを使用していくつかの計算が行われます。2つのエラーが発生します

1: nan 値および 2: TypeError: 不適切な入力: 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)
4

1 に答える 1

0

10 の累乗とログで数値的な問題が発生していると思います。たとえば、

logEc50_i ~= 7

次に、それを10乗します

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

それを10 乗します

ec50 = 10**(logEc50)

(それを2回行うのは単なる間違いですか?)

Antag次に、これに1e-7 の 2 つの数値の比率を掛けて、 1 に近い値にし、その対数をとります。

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

あなたは本当に対数のプロパティを使いたいと思います

log(a*b) = log(a) + log(b)
log(x**y) = y*log(x)

ここで数値の不安定性を防ぎます。

どのパラメーターがデータセット間で共有されることを意図しているのかわかりませんでしたが、それぞれに 7 つの変数を持つ 5 つの個別のデータセットを適合させるつもりであるように見えます。 ? 合計 22 個の観測しかない場合、それが 35 個の変数であろうと 31 個の変数であろうと大した問題ではありませんが、その多くの変数に適合する十分な観測がありません。

しかし、実際には 5 つのデータセットのそれぞれに 22 の観測があるようです。5 つのデータセットすべての残余配列が 110 要素になるように、各データセットの残差を評価してから結果を連結する必要があると思います。

于 2016-12-21T03:55:50.477 に答える