用于Python中偏差校正的直方图匹配

时间:2013-01-02 13:33:08

标签: python interpolation cdf

我试图找到观察到的数据的伽马函数的逆CDF,以便找到传递函数。整个目标是通过CDF匹配 CDFobs(y)= CDFsim(x)来纠正模拟数据中的偏差。我尝试使用以下方法进行抛出和错误。

下图显示了CDF和图(c)中的传递函数。我试图复制同样的东西。请帮助我实现情节。

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()

追踪(最近一次通话):   文件“/home/bias_correction.py”,第54行,in     transfer_func = invcdf(simcdf)

文件“/usr/lib/python2.7/dist-packages/scipy/interpolate/interpolate.py”,第357行,_ 调用 _     out_of_bounds = self._check_bounds(x_new)

文件“/usr/lib/python2.7/dist-packages/scipy/interpolate/interpolate.py”,第415行,在_check_bounds中     提高ValueError(“x_new中的值高于插值” ValueError:x_new中的值高于插值范围。

1 个答案:

答案 0 :(得分:2)

我认为interp1d的论点是相反的。它应该是

invcdf = interp1d(x, obscdf)