标签: statsmodels

如何计算scipy曲线拟合的可能性?

我有一个非线性模型拟合,如下所示:

曲线拟合

暗实线是模型拟合,灰色部分是原始数据.

问题的简短版本:我如何得到这个模型拟合的可能性,所以我可以进行对数似然比检验?假设残差是正态分布的.

我对统计数据比较陌生,我目前的想法是:

  1. 从曲线拟合中获取残差,并计算残差的方差;

  2. 使用此等式 正态分布的对数似然 并将残差的方差插入西格玛平方,x_i作为实验,mu作为模型拟合;

  3. 计算对数似然比.

这两个完整版的问题可以帮助我吗?

  1. 我的方法是否正确?(我想是这样,但确保真的很棒!)

  2. 在python/scipy/statsmodels中是否有任何现成的函数可以为我执行此操作?

python numpy scipy statsmodels

8
推荐指数
1
解决办法
5342
查看次数

Statsmodels:计算拟合值和R平方

我正在运行如下的回归(df是一个pandas数据帧):

import statsmodels.api as sm
est = sm.OLS(df['p'], df[['e', 'varA', 'meanM', 'varM', 'covAM']]).fit()
est.summary()
Run Code Online (Sandbox Code Playgroud)

除其他外,这给了我一个R平方0.942.那么我想绘制原始y-values值和拟合值.为此,我对原始值进行了排序:

orig = df['p'].values
fitted = est.fittedvalues.values
args = np.argsort(orig)
import matplotlib.pyplot as plt
plt.plot(orig[args], 'bo')
plt.plot(orig[args]-resid[args], 'ro')
plt.show()
Run Code Online (Sandbox Code Playgroud)

然而,这给了我一个图表,其中值完全关闭.什么都没有表明R平方0.9.因此,我试图自己手动计算:

yBar = df['p'].mean()
SSTot = df['p'].apply(lambda x: (x-yBar)**2).sum()
SSReg = ((est.fittedvalues - yBar)**2).sum()  
1 - SSReg/SSTot
Out[79]: 0.2618159806908984
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?或者,为什么我的计算与statsmodels得到的结果相差甚远?SSTot,SSReg有价值48084,35495.

python numpy statsmodels

8
推荐指数
2
解决办法
8047
查看次数

Statsmodels版本0.6.1不包括tsa?

我正在尝试使用statsmodels(sm)使HP过滤器工作.

这里的文档暗示模块sm.tsa已经存在0.6.1,但是我收到以下错误:

>>> import statsmodels as sm
>>> sm.__version__
'0.6.1'
>>> sm.tsa.filters.hp_filter.hpfilter()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'module' object has no attribute 'tsa'
>>> sm.tsa
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'module' object has no attribute 'tsa'
Run Code Online (Sandbox Code Playgroud)

这是我的pip输出:

nat-oitwireless-inside-vapornet100-a-14423:prog2 foobar$ pip show statsmodels
---
Name: statsmodels
Version: 0.6.1
Location: /usr/local/lib/python2.7/site-packages/statsmodels-0.6.1-py2.7-macosx-10.9-x86_64.egg
Requires: 
Run Code Online (Sandbox Code Playgroud)

python statsmodels

8
推荐指数
1
解决办法
4178
查看次数

statsmodels ARIMA.fit:隐藏输出

似乎每当我跑步时ARIMA.fit(),我总是从卡尔曼滤波器得到一个标准输出:

## -- End pasted text --
RUNNING THE L-BFGS-B CODE

           * * *

Machine precision = 2.220D-16
 N =            1     M =           12
 This problem is unconstrained.

At X0         0 variables are exactly at the bounds

At iterate    0    f=  5.60459D-01    |proj g|=  2.22045D-08

           * * *

Tit   = total number of iterations
Tnf   = total number of function evaluations
Tnint = total number of segments explored during Cauchy searches
Skip  = number of BFGS updates skipped …
Run Code Online (Sandbox Code Playgroud)

python scientific-computing statsmodels

8
推荐指数
1
解决办法
3388
查看次数

ValueError:您必须指定频率或x必须是带有时间序列索引的pandas对象

我以这种方式获得了时间序列数据:

from pandas.io.data import DataReader
from datetime import datetime
ts_log = DataReader('RUB=X',  'yahoo', datetime(2007,1,1), datetime(2016,8,30))["Adj Close"]
Run Code Online (Sandbox Code Playgroud)

ts_log看起来是这样的:

Date
2007-01-01    3.269759
2007-01-02    3.269759
2007-01-03    3.270519
  .....        ......
Run Code Online (Sandbox Code Playgroud)

然后,我想使用statsmodels进行分解:

from statsmodels.tsa.seasonal import seasonal_decompose
decomposition = seasonal_decompose(ts_log)
Run Code Online (Sandbox Code Playgroud)

ValueError:您必须指定频率或x必须是带有时间序列索引的pandas对象

为了解决这个问题,我尝试了两种方法:

1)这行不通,因为并非每天都有价值:

ts_log = pd.DataFrame(data=ts_log.values, index=pd.date_range(start=datetime(2007, 1, 1), 
                                                              end = datetime(2016,8,30), freq='D'), columns=['usd/rub'])
Run Code Online (Sandbox Code Playgroud)

2)我认为将索引转换为datetime应该可以,但是不能:

ts_log = pd.DataFrame(data=ts_log.values, index=pd.to_datetime(ts_log.index), columns=['usd/rub'])

完全一样的错误。

我该如何使工作正常?

PS该代码非常好,但是我有一些不同的数据,无论如何它应该可以帮助您了解这个想法:

length = 400
x = np.sin(np.arange(length)) * 10 + np.random.randn(length)
df = pd.DataFrame(data=x, index=pd.date_range(start=datetime(2015, 1, 1), periods=length, freq='w'), columns=['value'])
decomposition = seasonal_decompose(df)
Run Code Online (Sandbox Code Playgroud)

python datetime python-2.7 pandas statsmodels

8
推荐指数
0
解决办法
9810
查看次数

python ValueError:Start必须是日期.得到2016-01-01 | 2016-01-01 00:00:00

我正在使用statsmodels.tsa.statespace.sarimax进行预测.这是我的代码

pprint(list(rolmean_df.index)[0])
>> datetime.date(2015, 5, 19)

mod = sm.tsa.statespace.SARIMAX(rolmean_df['IC_10_diff'], trend='n', order=(2,1,2))
results = mod.fit()
s = results.get_prediction(start = pd.to_datetime('2016-01-01').date(), dynamic= False)
>> ValueError: Start must be in dates. Got 2016-01-01 | 2016-01-01 00:00:00
Run Code Online (Sandbox Code Playgroud)

我不确定我的"开始"格式是否错误或其他什么不起作用.

python statsmodels

8
推荐指数
1
解决办法
3027
查看次数

statsmodel AttributeError:模块'scipy.stats'没有属性'chisqprob'

我正在使用statsmodel 0.8.0运行下面的代码,我相信这是最新的.

import statsmodels.api as sm
est = sm.Logit(y_train, x_train)
result = est.fit()
print(result.summary())
Run Code Online (Sandbox Code Playgroud)

这给我一个错误说:

AttributeError:模块'scipy.stats'没有属性'chisqprob'.

我似乎无法在stackoverflow或其他地方找到任何东西来解决这个问题.任何帮助非常感谢.

python scipy statsmodels

8
推荐指数
1
解决办法
6299
查看次数

使用 sm.OLS 时是否需要添加常量?

我正在对两组数据 Y 和 X 执行 OLS。我使用 statsmodel.api.OLS。但是,无论我之前是否向 X 添加常量,我都发现了一些非常不同的结果。这是代码:

import statsmodels.api as sm
import numpy as np

mess = "SELECT .... FROM... WHERE ...."
data = np.array(db.extractData(mess))
Y = data[,:0]
X = data[,:1]
#Option1 
res = sm.OLS(Y,X).fit().rsquared ---> will return 0.76
#Option2
X = sm.add_constant(X)
res = sm.OLS(Y,X).fit().rsquared ---> will return 0.06
Run Code Online (Sandbox Code Playgroud)

考虑到我是否添加常量的巨大差异,我认为我做错了什么。非常感谢你花时间陪伴。

python statsmodels

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

熊猫格兰杰因果关系

我想使用 Python Pandas 对时间序列数据执行格兰杰因果关系测试,我有两个问题。

(1) 我曾尝试使用该pandas.stats.var软件包,但似乎已弃用。有没有其他推荐的选择?

(2) 我很难解释包中VAR.granger_causality()函数的输出pandas.stats.var。我能找到的唯一参考是源代码中的一条评论:

   Returns the f-stats and p-values from the Granger Causality Test.
   If the data consists of columns x1, x2, x3, then we perform the
   following regressions:
   x1 ~ L(x2, x3)
   x1 ~ L(x1, x3)
   x1 ~ L(x1, x2)
   The f-stats of these results are placed in the 'x1' column of the
   returned DataFrame.  We then repeat for x2, x3.
   Returns
   -------
   Dict, where 'f-stat' returns the DataFrame …
Run Code Online (Sandbox Code Playgroud)

python statistics scipy pandas statsmodels

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

Python 中的面板回归

我正在尝试对 Pandas Dataframes 运行面板回归:

目前我有两个数据框,每个数据框包含 52 行(日期)* 99 列(99 个股票):带有数据表示的 Markdown 文件

运行时:

est=sm.OLS(Stockslist,averages).fit()
est.summary()
Run Code Online (Sandbox Code Playgroud)

我得到 ValueError: 形状 (52,99) 和 (52,99) 未对齐:99 (dim 1) != 52 (dim 0)

有人可以指出我做错了什么吗?该模型只是 y(i,t)=x(i,t)+误差项,因此没有截距。但是我想在未来添加时间效果。

亲切的问候,杰伦

python pandas statsmodels

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