我在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) 我有时间序列数据,如下:
emplvl
date
2003-01-01 10955.000000
2003-04-01 11090.333333
2003-07-01 11157.000000
2003-10-01 11335.666667
2004-01-01 11045.000000
2004-04-01 11175.666667
2004-07-01 11135.666667
2004-10-01 11480.333333
2005-01-01 11441.000000
2005-04-01 11531.000000
2005-07-01 11320.000000
2005-10-01 11516.666667
2006-01-01 11291.000000
2006-04-01 11223.000000
2006-07-01 11230.000000
2006-10-01 11293.000000
2007-01-01 11126.666667
2007-04-01 11383.666667
2007-07-01 11535.666667
2007-10-01 11567.333333
2008-01-01 11226.666667
2008-04-01 11342.000000
2008-07-01 11201.666667
2008-10-01 11321.000000
2009-01-01 11082.333333
2009-04-01 11099.000000
2009-07-01 10905.666667
Run Code Online (Sandbox Code Playgroud)
我想以最简单的方式在该图上添加线性趋势(带截距).此外,我想计算这一趋势,仅以2006年之前的数据为条件.
我在这里找到了一些答案,但它们都包括在内statsmodels.首先,这些答案可能不是最新的:pandas改进,现在本身包括一个OLS组件.其次,statsmodels似乎估计每个时间段的个体固定效应,而不是线性趋势.我想我可以重新计算一个运行季度变量,但是大多数人都有更舒服的方法吗?
OLS Regression Results
==============================================================================
Dep. Variable: emplvl R-squared: 1.000
Model: OLS Adj. R-squared: nan
Method: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Python 和 Statsmodels 进行 ARIMA 预测。具体来说,要使 ARIMA 算法工作,需要通过差分(或类似方法)使数据静止。问题是:如何在进行残差预测后反转差异以返回包括差异化的趋势和季节性的预测?
(我在这里看到了一个类似的问题,但可惜,没有发布任何答案。)
这是我到目前为止所做的(基于掌握 Python 数据分析的最后一章中的示例,Magnus Vilhelm Persson;Luiz Felipe Martins)。数据来自DataMarket。
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
from statsmodels import tsa
from statsmodels.tsa import stattools as stt
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.arima_model import ARIMA
def is_stationary(df, maxlag=15, autolag=None, regression='ct'):
"""Test if df is stationary using Augmented
Dickey Fuller"""
adf_test = stt.adfuller(df,maxlag=maxlag, autolag=autolag, regression=regression)
adf = adf_test[0]
cv_5 = adf_test[4]["5%"]
result = …Run Code Online (Sandbox Code Playgroud) 我在对包含大约 7500 个数据点的数据集执行多重回归时遇到问题,其中某些列和行中缺少数据 (NaN)。每行至少有一个 NaN 值。某些行仅包含 NaN 值。
我正在使用 OLS Statsmodel 进行回归分析。我尽量不使用 Scikit Learn 来执行 OLS 回归,因为(我可能错了,但是)我必须在我的数据集中估算缺失的数据,这会在一定程度上扭曲数据集。
我的数据集如下所示: KPI
这就是我所做的(目标变量是 KP6,预测变量是剩余变量):
est2 = ols(formula = KPI.KPI6.name + ' ~ ' + ' + '.join(KPI.drop('KPI6', axis = 1).columns.tolist()), data = KPI).fit()
Run Code Online (Sandbox Code Playgroud)
它返回一个 ValueError: zero-size array to reduce operation maximum,它没有身份。
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-207-b24ba316a452> in <module>()
3 #test = KPI.dropna(how='all')
4 #test = KPI.fillna(0)
----> 5 est2 = ols(formula = KPI.KPI6.name + ' ~ ' + ' + …Run Code Online (Sandbox Code Playgroud) 我目前正在为我们需要逻辑回归的业务流程做一个概念验证.我一直在使用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) 我试图将季节性、趋势和残差与时间序列“XYZ.csv”(收集了 2 年以上的销售数据)分开。
[XYZ.csv 包含 2 列 - 日期和销售额。日期已被设置为代码中的索引。]
import pandas as pd
import statsmodels.api as sm
df = pd.read_csv('XYZ.csv')
df.date=pd.to_datetime(df.date)
df.set_index('date',inplace=True)
res = sm.tsa.seasonal_decompose
(df.colA.interpolate(),freq=?, model='additive')
resplot= res.plot()
observed = res.observed
seasonality = res.seasonal
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常。唯一的麻烦是理解如何计算这个时间序列的频率?如果有任何预定义的方式可以做到这一点。感谢您提前提供任何帮助/建议!
我想测试时间序列(nobs = 23)的平稳性,并从 statsmodels.tsa.stattools 实现了 adfuller 测试。
以下是原始数据:
1995-01-01 3126.0
1996-01-01 3321.0
1997-01-01 3514.0
1998-01-01 3690.0
1999-01-01 3906.0
2000-01-01 4065.0
2001-01-01 4287.0
2002-01-01 4409.0
2003-01-01 4641.0
2004-01-01 4812.0
2005-01-01 4901.0
2006-01-01 5028.0
2007-01-01 5035.0
2008-01-01 5083.0
2009-01-01 5183.0
2010-01-01 5377.0
2011-01-01 5428.0
2012-01-01 5601.0
2013-01-01 5705.0
2014-01-01 5895.0
2015-01-01 6234.0
2016-01-01 6542.0
2017-01-01 6839.0
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的自定义 ADF 函数(归功于此博客):
def test_stationarity(timeseries):
print('Results of Dickey-Fuller Test:')
dftest = adfuller(timeseries, autolag='AIC', maxlag = None)
dfoutput = pd.Series(dftest[0:4], index=['ADF Statistic', 'p-value', '#Lags Used', …Run Code Online (Sandbox Code Playgroud) 我想知道是哪条线或方法引起了未来警告!
predictors = weekly.columns[1:7] # the lags and volume
X = sm.add_constant(weekly[predictors]) # sm: statsmodels
y = np.array([1 if el=='Up' else 0 for el in weekly.Direction.values])
logit = sm.Logit(y,X)
results=logit.fit()
print(results.summary())
Run Code Online (Sandbox Code Playgroud)
C:\ Anaconda3 \ lib \ site-packages \ numpy \ core \ fromnumeric.py:2389:FutureWarning:方法.ptp已过时,将在以后的版本中删除。请改用numpy.ptp。返回ptp(axis = axis,out = out,** kwargs)
我在使用 statsmodels 的 get_margeff 命令处理具有交互项的 logit 模型时遇到问题。虽然在主效应模型中,效应被正确计算并对应于 Stata 和 R 结果,但当涉及交互项时情况并非如此。这里的效果是错误的,并且还报告了交互项的边际效果,这是没有意义的。以下代码说明了这一点:
import pandas as pd
import statsmodels.formula.api as sm
import statsmodels.api as sm2
df=sm2.datasets.heart.load_pandas().data
regression = sm.logit(formula='censors~survival+age', data=df).fit()
#only for illustration purposes; does not make real sense
print(regression.get_margeff().summary())
# the calculation of marginal effects here is corrects and corresponds to Stata and R results
Run Code Online (Sandbox Code Playgroud)
dy/dx std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
survival -0.0004 7.95e-05 -4.672 0.000 -0.001 -0.000
age 0.0148 0.005 3.262 0.001 0.006 0.024
==============================================================================
Run Code Online (Sandbox Code Playgroud)
regression = sm.logit(formula='censors~survival+age+survival*age', …Run Code Online (Sandbox Code Playgroud) R 中有一个非常有用的函数在包上调用findfrequency,forecast它返回时间序列的主频率周期。可以在此处找到有关作者功能的更多信息:https : //robjhyndman.com/hyndsight/tscharacteristics/
我想在 Python 中实现一些等效的东西,但我在处理应该等于spec.arfindfrequency 内的R 函数的函数时遇到了问题。
该函数从去趋势序列开始,这很容易用x = statsmodels.tsa.tsatools.detrend(myTs, order=1, axis=0). 现在我有了残差,我想在 Python 中做相当于spec.arR中的函数,它首先将 AR 模型拟合到 x(或使用现有拟合)并计算(并默认绘制)拟合模型的谱密度.
我没有发现任何类似的东西,所以我一次做每一步,首先是 AR,然后是规格估计。我正在使用Airpassengers时间序列,但对于 AR 顺序或系数,我无法在 R 和 Python 上获得相同的结果。
我的R代码:
x <- AirPassengers
x <- residuals(tslm(x ~ trend))
ARmodel <- ar(x)
ARmodel
Run Code Online (Sandbox Code Playgroud)
我知道 15 是我的自回归模型的选定顺序。
我的 Python 代码:
import statsmodels.api as sm
dataPeriodic = pd.read_csv('AirPassengers.csv')
tsPeriodic = dataPeriodic.iloc[:,1]
x = statsmodels.tsa.tsatools.detrend(tsPeriodic, order=1, axis=0)
n = x.shape[0]
est_order = …Run Code Online (Sandbox Code Playgroud) statsmodels ×10
python ×7
time-series ×4
pandas ×2
python-3.x ×2
arima ×1
forecast ×1
forecasting ×1
interaction ×1
matplotlib ×1
numpy ×1
regression ×1
signals ×1
valueerror ×1