【问题标题】:Scipy: Can you incorporate exponential weighting into distribution fitting?Scipy:你能将指数加权合并到分布拟合中吗?
【发布时间】:2018-02-08 16:23:42
【问题描述】:

给定一些时间序列数据:

np.random.seed(123)
r = pd.Series(np.random.beta(a=0.5, b=0.5, size=1000),
              index=pd.date_range('2013', periods=1000))

以及scipy.stats._continuous_distns._distn_names内的分布:

import scipy.stats as scs
dists = scs._continuous_distns._distn_names

我希望能够建立一个新的分布,然后将其称为.ppf(百分点函数),同时将指数权重纳入分布的构建中。

例如,对于normal 分布,这将只需要估计一个指数加权平均值和标准差:

所有连续分布都以 loc 和 scale 作为关键字参数 调整分布的位置和规模,例如为了 标准正态分布位置是平均值,尺度是 标准差。 [source]

ewm = r.ewm(span=60)
loc = ewm.mean().iloc[-1]
scale = ewm.std().iloc[-1]
print(scs.norm.ppf(q=0.05, loc=loc, scale=scale))
-0.196734019969

但我希望能够将其扩展到更广泛的连续分布系列,其中经常涉及其他参数 (shape)。例如,

  • johnsonsu 有参数a, b, loc, scale;
  • bradford有参数clocscale
  • burr 有参数cdlocscale

如何将此过程扩展到具有locscale 之外的参数的distributions

结合上面的sn-ps:

import scipy.stats as scs
import numpy as np
import pandas as pd
np.random.seed(123)
r = pd.Series(np.random.beta(a=0.5, b=0.5, size=1000),
              index=pd.date_range('2013', periods=1000))
ewm = r.ewm(span=60)
loc = ewm.mean().iloc[-1]
scale = ewm.std().iloc[-1]
print(scs.norm.ppf(q=0.05, loc=loc, scale=scale))
# -0.196734019969

【问题讨论】:

  • 你只是想估计 lambda 吗?
  • 好的,但是所有这些参数都可以用均值和方差来计算,所以只需要你运行这些计算
  • 我认为首先给出问题的清晰数学公式会有所帮助。 然后弄清楚如何实现它。问题“是否可以使用分布的 .fit 方法来估计参数,以某种方式结合指数权重?” 似乎太模糊了。
  • 简短回答:您需要重写分布 fit 函数以允许权重。目前不允许使用权重,所有观察都被视为来自给定分布的独立且同分布的观察。 (即加权 MLE 不仅仅是计算形状参数的加权矩方法)
  • @user333700 您认为我在下面的回答至少在某种程度上模仿了这种方法吗? (当然,我使用的引导是一个中间步骤,在您的方法中不会发生。)

标签: python python-3.x pandas scipy distribution


【解决方案1】:

这是我的实现:

  • 给定经验分布 x,为每个 x 分配指数权重。
  • 使用这些权重对新分布进行引导抽样。权重是pnp.random.choice 的参数。
  • 然后可以在该引导数据上调用任何分布的 .fit 方法。

代码:

def ewm_weights(i, alpha):
    w = (1 - alpha) ** np.arange(i)[::-1]
    w /= w.sum()
    return w

def bootstrap(a, alpha, size=None):
    p = ewm_weights(i=len(a), alpha=alpha)
    return np.random.choice(a=a, size=size, p=p)

ewm_weights的定义如下:

http://pandas.pydata.org/pandas-docs/stable/computation.html#exponentially-weighted-windows

adjust=True.

示例:

# Create a nonstationary `x` variable with larger mean and stdev in period 2
x1 = np.random.normal(loc=4, scale=3, size=1000)
x2 = np.random.normal(loc=10, scale=5, size=1000)
x = np.hstack((x1,x2))

x 的直方图如下所示:

plt.hist(x, bins=25)

虽然带有alpha=0.03 的自举b 看起来像:

b = bootstrap(x, alpha=0.03, size=int(1e6))
plt.hist(b, bins=25)

来自scipy.stats._continuous_distns._distn_names 的任何连续分布都可以拟合到b

问题:

  • softmax 函数可能会使ewm_weights 更安全。
  • 这种方法忽略了x 中的自相关。

【讨论】:

    猜你喜欢
    • 2014-03-19
    • 1970-01-01
    • 2011-10-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 2021-05-13
    • 2011-02-23
    相关资源
    最近更新 更多