我是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) 我很困惑为什么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) 我想要一个与之相关的系数和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一起工作.
当我尝试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)
这里发生了什么?我想不出来!某处有错误吗?
我找不到为什么计算两个系列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)

结果看起来质量上有所不同,这种差异来自哪里?
使用小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) 我在这里遵循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的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进行负二项回归.我发现这个例子使用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代码是正确的,我做错了什么?
我对使用点样本构建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 …
statsmodels ×10
python ×8
pandas ×4
r ×3
statistics ×3
numpy ×2
regression ×2
scipy ×2
anova ×1
dataframe ×1
time-series ×1
var ×1