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

暗实线是模型拟合,灰色部分是原始数据.
问题的简短版本:我如何得到这个模型拟合的可能性,所以我可以进行对数似然比检验?假设残差是正态分布的.
我对统计数据比较陌生,我目前的想法是:
从曲线拟合中获取残差,并计算残差的方差;
使用此等式
并将残差的方差插入西格玛平方,x_i作为实验,mu作为模型拟合;
计算对数似然比.
这两个完整版的问题可以帮助我吗?
我的方法是否正确?(我想是这样,但确保真的很棒!)
在python/scipy/statsmodels中是否有任何现成的函数可以为我执行此操作?
我正在运行如下的回归(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.
我正在尝试使用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) 似乎每当我跑步时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) 我以这种方式获得了时间序列数据:
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) 我正在使用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)
我不确定我的"开始"格式是否错误或其他什么不起作用.
我正在使用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或其他地方找到任何东西来解决这个问题.任何帮助非常感谢.
我正在对两组数据 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 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) 我正在尝试对 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 ×10
statsmodels ×10
pandas ×3
scipy ×3
numpy ×2
datetime ×1
python-2.7 ×1
statistics ×1