【问题标题】:Locating region between a confidence interval in data using Python使用 Python 定位数据中置信区间之间的区域
【发布时间】:2016-08-04 09:22:50
【问题描述】:

我有一些看起来像这样的数据:

生成此图的代码:

CI=4.5
data=pandas.DataFrame([3,5,1,2,3,4,5,6])
plt.figure()
plt.plot(data)
plt.plot([CI]*len(data),'--')
plt.ylabel('y data',fontsize=15)
plt.xlabel('x data',fontsize=15)
plt.title('example data',fontsize=15)

我还可以使用 scipy 插入数据:

from scipy.interpolate import interp1d
f=interp1d(x_data,y_data,kind='linear')
x_interp=numpy.linspace(min(x_data),max(x_data), num=100*len(x_data), endpoint=True)
y_interp=f(x_interp)        
plt.figure()
plt.plot(x_interp,y_interp)

绿线代表置信区间。我需要以编程方式定位 y 值与内部置信度相交的 x 值。但是,复杂之处在于,由于这是一个置信区间,我需要获得在两个方向上都穿过绿线的值:

即我需要 y 数据与红色箭头交叉的 x 值,同时排除黑色箭头处的 x 值。我尝试了许多从插值数据中减去置信区间以及获取绝对值的变体,但我仍然无法隔离置信区间。

【问题讨论】:

  • 置信区间是一系列值,例如,lower_bound = CI - something; upper_bound = CI + something_else。我也不明白为什么黑色箭头是黑色的,而另一个被视为红色。
  • 这不是意味着你想要所有东西都在绿线以上吗?
  • @Reti43 箭头仅用于说明 - 数据也是如此(因为在此处提供真实数据不太可行)。在真实数据中是的,CI 将是参数估计 +/- 置信区间。但由于非线性,它们是非对称的。
  • @armatita - 通常是的,但我使用的数据是平方和的结果,而不是对数似然目标函数(它会高于,而不是低于绿线)。无论哪种方式,无论是在绿线之上还是之下,手头的计算任务都是相同的。感谢回复
  • 为了演示的合成数据很好。但是您的问题中不代表您的实际问题的任何方面都会分散注意力或令人困惑。非常明确,您是否想要 y 值位于特定范围内的 x 值,即某个平均值的 +/-?

标签: python numpy scipy interpolation confidence-interval


【解决方案1】:

基于

我想要 x y 值在特定范围内的值

看来您只是在寻找面具。如果你给 numpy 一个关系语句,例如my_array > x,它将为满足此关系的任何索引返回一个带有True 的布尔数组。如果您将这样的掩码传递给数组进行索引,它将返回此掩码为True 的值。例如,

In [2]: a = np.array([1, 3, 2, 5, 2, 9, 4])

In [3]: a > 2
Out[3]: array([False,  True, False,  True, False,  True,  True], dtype=bool)

In [4]: a[a > 2]
Out[4]: array([3, 5, 9, 4])

因此,要查找f(x) 位于特定范围内的x 值,请找到f(x) 在所需范围内的索引,并根据该掩码过滤您的x

# multiplication between 1s and 0s acts like logical AND
mask = (y_interp >= lower_bound) * (y_interp <= upper_bound)
accepted_parameters = x_interp[mask]

【讨论】:

  • 除了*,您还可以将元素AND&amp; 一起使用,这样可以达到同样的效果。
猜你喜欢
  • 1970-01-01
  • 2019-04-30
  • 2018-07-13
  • 2020-10-06
  • 2017-04-27
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
相关资源
最近更新 更多