标签: statsmodels

在Python中使用pandas + statsmodels的VAR模型

我是R的狂热用户,但最近由于几个不同的原因切换到Python.但是,我正在努力从statsmodels运行Python中的矢量AR模型.

,Q#1.我运行时遇到错误,我怀疑它与我的矢量类型有关.

    import numpy as np
    import statsmodels.tsa.api
    from statsmodels import datasets
    import datetime as dt
    import pandas as pd
    from pandas import Series
    from pandas import DataFrame
    import os

    df = pd.read_csv('myfile.csv')
    speedonly = DataFrame(df['speed'])
    results = statsmodels.tsa.api.VAR(speedonly)

    Traceback (most recent call last):
    File "<pyshell#14>", line 1, in <module>
      results = statsmodels.tsa.api.VAR(speedonly)
    File "C:\Python27\lib\site-packages\statsmodels\tsa\vector_ar\var_model.py", line 336, in __init__
      super(VAR, self).__init__(endog, None, dates, freq)
    File "C:\Python27\lib\site-packages\statsmodels\tsa\base\tsa_model.py", line 40, in __init__
      self._init_dates(dates, freq)
    File "C:\Python27\lib\site-packages\statsmodels\tsa\base\tsa_model.py", line 54, in _init_dates
      raise ValueError("dates …
Run Code Online (Sandbox Code Playgroud)

python var pandas statsmodels

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

为什么statsmodels不能重现我的R逻辑回归结果?

我很困惑为什么R和statsmodels中的逻辑回归模型不一致.

如果我在R中准备一些数据

# From https://courses.edx.org/c4x/MITx/15.071x/asset/census.csv
library(caTools) # for sample.split
census = read.csv("census.csv")
set.seed(2000)
split = sample.split(census$over50k, SplitRatio = 0.6)
censusTrain = subset(census, split==TRUE)
censusTest = subset(census, split==FALSE)
Run Code Online (Sandbox Code Playgroud)

然后运行逻辑回归

CensusLog1 = glm(over50k ~., data=censusTrain, family=binomial)
Run Code Online (Sandbox Code Playgroud)

我看到的结果

                                           Estimate Std. Error z value Pr(>|z|)    
(Intercept)                              -8.658e+00  1.379e+00  -6.279 3.41e-10 ***
age                                       2.548e-02  2.139e-03  11.916  < 2e-16 ***
workclass Federal-gov                     1.105e+00  2.014e-01   5.489 4.03e-08 ***
workclass Local-gov                       3.675e-01  1.821e-01   2.018 0.043641 *  
workclass Never-worked                   -1.283e+01  8.453e+02  -0.015 0.987885    
workclass Private                         6.012e-01  1.626e-01 …
Run Code Online (Sandbox Code Playgroud)

python r dataframe statsmodels logistic-regression

5
推荐指数
1
解决办法
1918
查看次数

Python中OLS的Newey-West标准错误?

我想要一个与之相关的系数和Newey-West标准误.

我正在寻找Python库(理想情况下,但任何工作解决方案都很好)可以做以下R代码正在做的事情:

library(sandwich)
library(lmtest)

a <- matrix(c(1,3,5,7,4,5,6,4,7,8,9))
b <- matrix(c(3,5,6,2,4,6,7,8,7,8,9))

temp.lm = lm(a ~ b)

temp.summ <- summary(temp.lm)
temp.summ$coefficients <- unclass(coeftest(temp.lm, vcov. = NeweyWest))

print (temp.summ$coefficients)
Run Code Online (Sandbox Code Playgroud)

结果:

             Estimate Std. Error   t value  Pr(>|t|)
(Intercept) 2.0576208  2.5230532 0.8155281 0.4358205
b           0.5594796  0.4071834 1.3740235 0.2026817
Run Code Online (Sandbox Code Playgroud)

我得到系数并与它们相关的标准误差.

我看到statsmodels.stats.sandwich_covariance.cov_hac模块,但我不知道如何使它与OLS一起工作.

python statistics time-series statsmodels

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

使用scipy.stats和statsmodels计算线性回归时的结果不同

当我尝试OLS适合这两个库时,我得到不同的r ^ 2值(确定系数),我无法弄清楚原因.(为方便起见,删除了一些间距)

In [1]: import pandas as pd       
In [2]: import numpy as np
In [3]: import statsmodels.api as sm
In [4]: import scipy.stats
In [5]: np.random.seed(100)
In [6]: x = np.linspace(0, 10, 100) + 5*np.random.randn(100)
In [7]: y = np.arange(100)

In [8]: slope, intercept, r, p, std_err = scipy.stats.linregress(x, y)

In [9]: r**2
Out[9]: 0.22045988449873671

In [10]: model = sm.OLS(y, x)
In [11]: est = model.fit()

In [12]: est.rsquared
Out[12]: 0.5327910685035413
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?我想不出来!某处有错误吗?

python statistics scipy statsmodels

5
推荐指数
1
解决办法
2508
查看次数

numpy和statsmodels在计算相关性时会给出不同的值,如何解释?

我找不到为什么计算两个系列A和B之间的相关性numpy.correlate给出的结果与我得到的结果不同的原因statsmodels.tsa.stattools.ccf

以下是我提到的这种差异的一个例子:

import numpy as np
from matplotlib import pyplot as plt
from statsmodels.tsa.stattools import ccf

#Calculate correlation using numpy.correlate
def corr(x,y):
    result = numpy.correlate(x, y, mode='full')
    return result[result.size/2:]

#This are the data series I want to analyze
A = np.array([np.absolute(x) for x in np.arange(-1,1.1,0.1)])
B = np.array([x for x in np.arange(-1,1.1,0.1)])

#Using numpy i get this
plt.plot(corr(B,A))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

#Using statsmodels i get this
plt.plot(ccf(B,A,unbiased=False))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

结果看起来质量上有所不同,这种差异来自哪里?

python numpy cross-correlation statsmodels

5
推荐指数
1
解决办法
1953
查看次数

为什么R和statsmodels给出的ANOVA结果略有不同?

使用小R样本数据集和来自statsmodels的ANOVA示例,其中一个变量的自由度报告不同,并且F值结果也略有不同.也许他们的默认方法略有不同?我可以设置statsmodels来使用R的默认值吗?

import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols


##R code on R sample dataset

#> anova(with(ChickWeight, lm(weight ~ Time + Diet)))
#Analysis of Variance Table
#
#Response: weight
#           Df  Sum Sq Mean Sq  F value    Pr(>F)
#Time        1 2042344 2042344 1576.460 < 2.2e-16 ***
#Diet        3  129876   43292   33.417 < 2.2e-16 ***
#Residuals 573  742336    1296
#write.csv(file='ChickWeight.csv', x=ChickWeight, row.names=F)

cw = pd.read_csv('ChickWeight.csv')
cw_lm=ols('weight ~ Time + Diet', data=cw).fit()   

print(sm.stats.anova_lm(cw_lm, typ=2))
#                  sum_sq …
Run Code Online (Sandbox Code Playgroud)

r anova pandas statsmodels

5
推荐指数
1
解决办法
1228
查看次数

使用StatsModels绘制二阶多项式的分位数回归

我在这里遵循StatsModels示例来绘制分位数回归线.只需对我的数据稍作修改,该示例效果很好,生成此绘图(请注意,我已修改代码以仅绘制0.05,0.25,0.5,0.75和0.95分位数): 在此输入图像描述

但是,我想绘制OLS拟合和相应分位数的二阶多项式拟合(而不是线性).例如,以下是相同数据的二阶OLS行: 在此输入图像描述

如何修改链接示例中的代码以生成非线性分位数?

这是我从链接示例中修改的相关代码,以生成第一个图:

d = {'temp': x, 'dens': y}
df = pd.DataFrame(data=d)

# Least Absolute Deviation
# 
# The LAD model is a special case of quantile regression where q=0.5

mod = smf.quantreg('dens ~ temp', df)
res = mod.fit(q=.5)
print(res.summary())

# Prepare data for plotting
# 
# For convenience, we place the quantile regression results in a Pandas DataFrame, and the OLS results in a dictionary.

quantiles = [.05, .25, .50, .75, .95]
def fit_model(q):
    res = …
Run Code Online (Sandbox Code Playgroud)

python regression pandas statsmodels

5
推荐指数
1
解决办法
4675
查看次数

Python:使用Statsmodels - 线性回归预测y值

我正在使用Python的statsmodels库来使用线性回归来预测未来的平衡.csv文件显示如下:

| 平衡
3 | 30
8 | 57
9 | 64
13 | 72
3 | 36
6 | 43
11 | 59
21 | 90
1 | 20
16 | 83
它包含"年份"作为独立变量"x",而"余额"是从属"y"的可变

以下是此数据的线性回归代码:

import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
import numpy as np
from matplotlib import pyplot as plt

import os
os.chdir('C:\Users\Admin\Desktop\csv')

cw = pd.read_csv('data-table.csv')
y=cw.Balance
X=cw.Year

X = sm.add_constant(X)  # Adds a constant term to the predictor

est = sm.OLS(y, …
Run Code Online (Sandbox Code Playgroud)

python regression pandas statsmodels

5
推荐指数
1
解决办法
2650
查看次数

Python负二项回归 - 结果与R匹配

我正在尝试使用Python进行负二项回归.我发现这个例子使用R和一个数据集:

http://www.karlin.mff.cuni.cz/~pesta/NMFM404/NB.html

我尝试使用以下代码在网页上复制结果:

import pandas as pd
import statsmodels.formula.api as smf 
import statsmodels.api as sm

df = pd.read_stata("http://www.karlin.mff.cuni.cz/~pesta/prednasky/NMFM404/Data/nb_data.dta")

model = smf.glm(formula = "daysabs ~ math + prog", data=df, family=sm.families.NegativeBinomial()).fit()

model.summary()
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并没有给出相同的系数.它给出了以下内容:

coef        std err     z       P>|z|   [95.0% Conf. Int.]
Intercept    3.4875     0.236   14.808  0.000    3.026  3.949
math        -0.0067     0.003   -2.600  0.009   -0.012 -0.002
prog        -0.6781     0.101   -6.683  0.000   -0.877 -0.479
Run Code Online (Sandbox Code Playgroud)

这些甚至都不在网站上.假设R代码是正确的,我做错了什么?

python statistics r statsmodels

5
推荐指数
1
解决办法
3106
查看次数

在统计模型中重新采样KDE(内核密度估计)

我对使用点样本构建KDE感兴趣,然后使用该KDE对点进行重采样。scipy.stats.gaussian_kde提供了一种非常简单的方法来执行此操作。例如,从高斯分布中采样:

import numpy as np
from scipy.stats import gaussian_kde, norm

sampled = np.random.normal(loc = 0, scale = 1, size = 1000)
kde = gaussian_kde(sampled, bw_method = 'silverman')
resampled = kde.resample(1000)
Run Code Online (Sandbox Code Playgroud)

它的一个缺点scipy.stats.gaussian_kde是它提供有限的带宽选择选项。通过阅读此内容,我被指向statsmodels.nonparametric.kernel_density.KDEMultivariate在此处有更多信息)。这使我可以使用交叉验证来估计最佳带宽,如果您要近似估算的基础pdf不是单峰的,则带宽更为复杂。例如,使用两个高斯之和,我可以使用KDEMultivariate以下方法构造一个KDE :

from statsmodels.nonparametric.kernel_density import KDEMultivariate
sampled = np.concatenate((np.random.normal(loc = -3, scale = 1, size = 1000), \
                          np.random.normal(loc = 3, scale = 1, size = 1000)))
kde = KDEMultivariate(sampled, 'c', bw = 'cv_ml')
Run Code Online (Sandbox Code Playgroud)

通过使用任意基础的pdf探索更高维度的数据,很明显,KDEMultivariate它能够生成一个更能代表原始PDF的PDF。但是我遇到了一个大问题- KDEMultivariate …

numpy scipy statsmodels

5
推荐指数
1
解决办法
795
查看次数