标签: statsmodels

这个时间序列是否静止?

我想检查TS.csv中保存的时间序列数据的静止.

但是,R tseries::adf.test()和Python的statsmodels.tsa.stattools.adfuller() 结果完全不同.

adf.test()显示它是静止的(p <0.05),同时adfuller()显示它是非静止的(p> 0.05).

以下代码有什么问题吗?

在R和Python中测试固定时间序列的正确过程是什么?

谢谢.

R代码:

> rd <- read.table('Data/TS.csv', sep = ',', header = TRUE)
> inp <- ts(rd$Sales, frequency = 12, start = c(1965, 1))
> inp
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1965 154  96  73  49  36  59  95 169 210 278 298 245
1966 200 118  90  79  78  91 167 169 289 347 375 …
Run Code Online (Sandbox Code Playgroud)

python r time-series statsmodels arima

7
推荐指数
1
解决办法
1033
查看次数

为什么statsmodels GLM在结果中没有R ^ 2?

我在statsmodels中做了一个简单的GLM实验,并且很难找到为什么GLM结果不包含任何R ^ 2属性?

我觉得这里有一些非常简单的事情,为什么GLM没有R ^ 2计算,以及我自己可以计算的方法.

谢谢!

In [1]: import pandas as np

In [2]: import pandas as pd

In [3]: import numpy as np

In [4]: import statsmodels.api as sm

In [5]: data = pd.DataFrame({'col1':np.arange(10),'col2':np.arange(
KeyboardInterrupt

In [5]: x  = np.arange(0,10,0.5)

In [6]: 

In [6]: y = np.zeros(len(x))

In [7]: y[0] = 0

In [8]: for i in range(1,len(x)):
   ...:         y[i] = 0.5*x[i] + 2.5*y[i-1] + 10*np.random.rand()
   ...:     

In [9]: print y
[  0.00000000e+00   9.35177024e-01   8.18487881e+00   2.95126464e+01
   8.08584645e+01   2.11423251e+02 …
Run Code Online (Sandbox Code Playgroud)

python statsmodels

6
推荐指数
2
解决办法
2158
查看次数

减少statsmodels glm的多处理

我目前正在为我们需要逻辑回归的业务流程做一个概念验证.我一直在使用statsmodels glm来对我们的数据集进行分类(如下面的代码所示).我们的数据集包括~10M行和大约80个特征(其中大约70多个是假人,例如基于定义的分类变量的"1"或"0").使用较小的数据集,glm工作正常,但是如果我针对完整的数据集运行它,python会抛出错误"无法分配内存".

glmmodel = smf.glm(formula, data, family=sm.families.Binomial())
glmresult = glmmodel.fit()
resultstring = glmresult.summary().as_csv()
Run Code Online (Sandbox Code Playgroud)

这让我觉得这可能是因为statsmodels旨在利用所有可用的cpu核心,下面的每个子进程都会在RAM中创建数据集的副本(如果我弄错了,请纠正我).现在的问题是,如果有一种方法可以让glm只使用最少数量的内核吗?我没有进入性能,只是希望能够对整个数据集运行glm.

作为参考,下面是机器配置和一些更多信息(如果需要).

CPU: 10 cores
RAM: 40 GB (usable/free ~25GB as there are other processes running on the 
same machine)
swap: 16 GB
dataset size: 1.4 GB (based on Panda's DataFrame.info(memory_usage='deep')
Run Code Online (Sandbox Code Playgroud)

python-3.x statsmodels

6
推荐指数
1
解决办法
803
查看次数

如何对 pandas 数据框运行多重共线性测试?

我对 Python、统计和使用 DS 库比较陌生,我的要求是对具有 n 列的数据集运行多重共线性测试,并确保 VIF > 5 的列/变量被完全删除。

我找到了一个代码,

 from statsmodels.stats.outliers_influence import variance_inflation_factor

    def calculate_vif_(X, thresh=5.0):

        variables = range(X.shape[1])
        tmp = range(X[variables].shape[1])
        print(tmp)
        dropped=True
        while dropped:
            dropped=False
            vif = [variance_inflation_factor(X[variables].values, ix) for ix in range(X[variables].shape[1])]

            maxloc = vif.index(max(vif))
            if max(vif) > thresh:
                print('dropping \'' + X[variables].columns[maxloc] + '\' at index: ' + str(maxloc))
                del variables[maxloc]
                dropped=True

        print('Remaining variables:')
        print(X.columns[variables])
        return X[variables]
Run Code Online (Sandbox Code Playgroud)

但是,我不清楚,我应该将数据集完全传递到 X 参数的位置吗?如果是,则不起作用。

请帮忙!

pandas statsmodels python-3.6

6
推荐指数
2
解决办法
2万
查看次数

具有多重共线性问题的 statsmodel 中的聚类标准误差

我正在使用 statsmodel 进行 OLS 回归。当我对标准错误进行聚类时,出现了一条警告消息,表明存在多重共线性问题。但是,如果我只是拟合没有聚集错误的模型,则不会出现此类警告。

mod = smf.ols(formula = var ~ treatment_r1 + block + has_multiple_treat', data = df)
mod_res = mod.fit(cov_type='cluster', cov_kwds={'groups': df['block']}, use_t=True)



ValueWarning: covariance of constraints does not have full rank. The number of constraints is 3, but rank is 1
      'rank is %d' % (J, J_), ValueWarning)
Run Code Online (Sandbox Code Playgroud)

我在这篇文章《Capturing high multi-collinearity in statsmodels》之后检查了共线性,没有发现任何问题。

corr = np.corrcoef(df_new[["var", "has_multiple_treat", "treatment_r1", "block1"]], rowvar=0)
w, v = np.linalg.eig(corr)
w
np.linalg.det(corr)
Run Code Online (Sandbox Code Playgroud)

var可以是01变量或者连续变量;Treatment_r1has_multiple_treat是 0 …

python statsmodels

6
推荐指数
0
解决办法
3762
查看次数

是否有使用 anova 比较两个或多个逻辑回归模型的 python 函数?

我正在尝试实现此“R”代码的 Python 版本,通过查找偏差统计数据来比较 2 个或更多 Logistic 回归模型

anova(LogisticModel.1, LogisticModel.2)
Run Code Online (Sandbox Code Playgroud)

给出这样的输出 在此输入图像描述

线性模型的 anova 测试有一个实现,其工作原理如下:

from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

m01 = ols('sales~adverts', data=df).fit()
m02 = ols('sales~adverts+airplay', data=df).fit()
m03 = ols('sales~adverts+airplay+attract', data=df).fit()
anovaResults = anova_lm(m01, m02, m03)
print(anovaResults)
Run Code Online (Sandbox Code Playgroud)

输出如下 在此输入图像描述

我已经通过手动计算计算了 Logistic 回归表中描述的残差 df、残差偏差、偏差,但我想知道是否有任何东西可以使用任何库在 Python 中自动执行此操作。

这里已经提出了类似的问题,但仍未得到答复。

python anova statsmodels logistic-regression

6
推荐指数
0
解决办法
1528
查看次数

如何使用statsmodels库中的ccf()方法?

ccf()我在使用(Python)库中的方法时遇到一些问题statsmodels。等效操作在 R 中运行良好。

ccf产生两个变量之间的互相关函数,在我的示例ABA我有兴趣了解领先指标的程度B

我正在使用以下内容:

import pandas as pd
import numpy as np
import statsmodels.tsa.stattools as smt
Run Code Online (Sandbox Code Playgroud)

我可以模拟A如下B

np.random.seed(123)
test = pd.DataFrame(np.random.randint(0,25,size=(79, 2)), columns=list('AB'))
Run Code Online (Sandbox Code Playgroud)

当我运行时ccf,我得到以下信息:

ccf_output = smt.ccf(test['A'],test['B'], unbiased=False)
ccf_output    
array([ 0.09447372, -0.12810284,  0.15581492, -0.05123683,  0.23403344,
    0.0771812 ,  0.01434263,  0.00986775, -0.23812752, -0.03996113,
   -0.14383829,  0.0178347 ,  0.23224969,  0.0829421 ,  0.14981321,
   -0.07094772, -0.17713121,  0.15377192, -0.19161986,  0.08006699,
   -0.01044449, -0.04913098,  0.06682942, -0.02087582,  0.06453489,
    0.01995989, -0.08961562,  0.02076603, …
Run Code Online (Sandbox Code Playgroud)

python time-series cross-correlation statsmodels

6
推荐指数
1
解决办法
1万
查看次数

如何将 statsmodels.tsa.seasonal.seasonal_decompose 与 pandas 数据框一起使用

from statsmodels.tsa.seasonal import seasonal_decompose
      def seasonal_decomp(df, model="additive"):
        seasonal_df = None
        seasonal_df = seasonal_decompose(df, model='additive')
        return seasonal_df
    
 seasonal_decomp(df)
Run Code Online (Sandbox Code Playgroud)

错误

from statsmodels.tsa.seasonal import seasonal_decompose
      def seasonal_decomp(df, model="additive"):
        seasonal_df = None
        seasonal_df = seasonal_decompose(df, model='additive')
        return seasonal_df
    
 seasonal_decomp(df)
Run Code Online (Sandbox Code Playgroud)

测试数据

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-93-00543113a58a> in <module>
----> 1 seasonal_decompose(df, model='additive')

e:\Anaconda3\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs)
    197                 else:
    198                     kwargs[new_arg_name] = new_arg_value
--> 199             return func(*args, **kwargs)
    200 
    201         return cast(F, wrapper)

e:\Anaconda3\lib\site-packages\statsmodels\tsa\seasonal.py in seasonal_decompose(x, model, filt, period, two_sided, extrapolate_trend)
    185     for …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas statsmodels

6
推荐指数
1
解决办法
9890
查看次数

内生变量的长度必须大于所使用的滞后数

我最近正在阅读 Susan Li 撰写的关于 Python 时间序列分析的教程。我正在以下系列上拟合时间序列 SARIMAX 模型:

y['2017':]

OUT: 
Order Date
2017-01-01     397.602133
2017-02-01     528.179800
2017-03-01     544.672240
2017-04-01     453.297905
2017-05-01     678.302328
2017-06-01     826.460291
2017-07-01     562.524857
2017-08-01     857.881889
2017-09-01    1209.508583
2017-10-01     875.362728
2017-11-01    1277.817759
2017-12-01    1256.298672
Freq: MS, Name: Sales, dtype: float64
Run Code Online (Sandbox Code Playgroud)

使用以下内容:

mod = sm.tsa.statespace.SARIMAX(y,
                                order=(1, 1, 1),
                                seasonal_order=(1, 1, 0, 12),
                                enforce_stationarity=False,
                                enforce_invertibility=False)

results = mod.fit()

print(results.summary().tables[1])
Run Code Online (Sandbox Code Playgroud)

现在,直到这里为止效果都很好,但是当我尝试可视化结果时,我收到以下错误:

results.plot_diagnostics(figsize=(16, 8))
Run Code Online (Sandbox Code Playgroud)
OUT: 
ValueError                                Traceback (most recent call last)
<ipython-input-16-6cfeaa52b7c1> in <module>
----> 1 results.plot_diagnostics(figsize=(16, 8))
      2 plt.show()

~/opt/anaconda3/lib/python3.8/site-packages/statsmodels/tsa/statespace/mlemodel.py in …
Run Code Online (Sandbox Code Playgroud)

python time-series statsmodels arima

6
推荐指数
3
解决办法
6975
查看次数

创建非标准 Pandas 频率(“dekads”= 每月 3 个周期)

由于statsmodels.tseries模型需要具有给定频率的索引来进行预测,因此我需要我的数据具有非标准频率。

\n

因此,我想创建一个新频率来分配给pandas.DateTimeIndex。\n这是dekad一年中有 36 个周期的频率。每个月三个。第一个总是在该月的 10 日,第二个是该月的 20 日,最后一个是该月的最后一天。

\n

困难在于该月的最后一天:

\n
    \n
  1. 2 月的日期有所不同,具体取决于是否是闰年(28 日或 29 日)
  2. \n
  3. 取决于该月的天数(28、29、30、31)
  4. \n
\n

然而,最终它是一个固定的频率(每月 3 次,每年 36 个周期)。

\n

原因是statsmodels.tsa.holtwinters模型需要具有给定频率的索引来进行预测。当我尝试运行holtwinters预测时,我收到以下警告消息:

\n
/home/tommy/miniconda3/envs/ml/lib/python3.8/site-packages/statsmodels/tsa/base/tsa_model.py:216: ValueWarning: A date index has been provided, but it has no associated frequency information and so will be ignored when e.g. forecasting.\n
Run Code Online (Sandbox Code Playgroud)\n

这就是十倍时间步长的样子:

\n
/home/tommy/miniconda3/envs/ml/lib/python3.8/site-packages/statsmodels/tsa/base/tsa_model.py:216: ValueWarning: A date index has been provided, but it has no associated frequency …
Run Code Online (Sandbox Code Playgroud)

python datetime time-series pandas statsmodels

6
推荐指数
1
解决办法
261
查看次数