3

シミュレーションデータと観測降水量データのヒストグラムマッチングを試みています。以下に、単純なシミュレーションのケースを示します。シミュレートされたデータと観測されたデータの両方のCDFを取得し、3つでスタックしました。手がかりが私を乗り越えるのに役立つことを願っています..事前にありがとう

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
import scipy.stats as st


sim = st.gamma(1,loc=0,scale=0.8) # Simulated
obs = st.gamma(2,loc=0,scale=0.7) # Observed
x = np.linspace(0,4,1000)
simpdf = sim.pdf(x)
obspdf = obs.pdf(x)
plt.plot(x,simpdf,label='Simulated')
plt.plot(x,obspdf,'r--',label='Observed')
plt.title('PDF of Observed and Simulated Precipitation')
plt.legend(loc='best')
plt.show()

plt.figure(1)
simcdf = sim.cdf(x)
obscdf = obs.cdf(x)
plt.plot(x,simcdf,label='Simulated')
plt.plot(x,obscdf,'r--',label='Observed')
plt.title('CDF of Observed and Simulated Precipitation')
plt.legend(loc='best')
plt.show()

# Inverse CDF
invcdf = interp1d(obscdf,x)
transfer_func = invcdf(simcdf)

plt.figure(2)
plt.plot(transfer_func,x,'g-')
plt.show()
4

1 に答える 1

4

コードを再現しようとしましたが、次のエラーが発生しました。

ValueError: A value in x_new is above the interpolation range.

2つのCDFのプロットを見ると、何が起こっているのかを理解するのは非常に簡単です。

ここに画像の説明を入力してください

ここで定義するとき、次の範囲invcdf = interp1d(obscdf, x)に注意してください。obscdf

>>> obscdf[0]
0.0
>>> obscdf[-1]
0.977852889924409

したがってinvcdf、これらの制限の間でのみ値を補間できます。それらを超えると、外挿を行う必要がありますが、これはそれほど明確に定義されているわけではありません。SciPyのデフォルトの動作は、外挿を求められたときにエラーを発生させることです。あなたが求めるとき、それはまさに何が起こるかですinvcdf(simcdf)、なぜなら

>>> simcdf[-1]
0.99326205300091452

補間範囲を超えています。

ドキュメントを読むとinterp1dこの動作を変更できることがわかります。

invcdf = interp1d(obscdf, x, bounds_error=False)

plt.plot(x, transfer_func,'g-')これですべてが正常に機能しますが、投稿した図と同じになるには、プロット引数の順序を逆にする必要があります。

ここに画像の説明を入力してください

于 2013-01-06T06:27:03.813 に答える