我尝试使用时间序列数据进行多次回归,但是当我将时间序列列添加到我的模型时,它最终将每个唯一值视为一个单独的变量,就像这样(我的' date'列的类型为datetime):
est = smf.ols(formula='r ~ spend + date', data=df).fit()
print est.summary()
coef std err t P>|t| [95.0% Conf. Int.]
Intercept -6.249e-10 inf -0 nan nan nan
date[T.Timestamp('2014-10-08 00:00:00')] -2.571e-10 inf -0 nan nan nan
date[T.Timestamp('2014-10-15 00:00:00')] 9.441e-11 inf 0 nan nan nan
date[T.Timestamp('2014-10-22 00:00:00')] 5.619e-11 inf 0 nan nan nan
date[T.Timestamp('2014-10-29 00:00:00')] -8.035e-12 inf -0 nan nan nan
date[T.Timestamp('2014-11-05 00:00:00')] 6.334e-11 inf 0 nan nan nan
date[T.Timestamp('2014-11-12 00:00:00')] 7.9e+04 inf 0 nan nan nan
date[T.Timestamp('2014-11-19 00:00:00')] 1.58e+05 inf 0 nan nan nan
date[T.Timestamp('2014-11-26 00:00:00')] 1.58e+05 inf 0 nan nan nan
date[T.Timestamp('2014-12-03 00:00:00')] 1.58e+05 inf 0 nan nan nan
date[T.Timestamp('2014-12-10 00:00:00')] 2.28e+05 inf 0 nan nan nan
date[T.Timestamp('2014-12-17 00:00:00')] 3.28e+05 inf 0 nan nan nan
date[T.Timestamp('2014-12-24 00:00:00')] 3.705e+05 inf 0 nan nan nan
spend 2.105e-10 inf 0 nan nan nan
我也尝试过statsmodel的tms包,但不知道如何处理频率':
ar_model = sm.tsa.AR(df, freq='1')
ValueError: Pandas data cast to numpy dtype of object. Check input data with np.asarray(data).
答案 0 :(得分:2)
我真的很想看到数据样本和代码片段来重现您的错误。 没有它,我的建议不会解决您的特定错误消息。但是,它允许您对存储在pandas数据帧中的一组时间序列运行多元回归分析。假设您在时间序列中使用连续值而非分类值,以下是使用pandas和statsmodel进行此操作的方法:
具有随机值的数据框:
# Imports
import pandas as pd
import numpy as np
import itertools
np.random.seed(1)
rows = 12
listVars= ['y','x1', 'x2', 'x3']
rng = pd.date_range('1/1/2017', periods=rows, freq='D')
df_1 = pd.DataFrame(np.random.randint(100,150,size=(rows, len(listVars))), columns=listVars)
df_1 = df_1.set_index(rng)
print(df_1)
输出 - 一些可用的数据:
y x1 x2 x3
2017-01-01 137 143 112 108
2017-01-02 109 111 105 115
2017-01-03 100 116 101 112
2017-01-04 107 145 106 125
2017-01-05 120 137 118 120
2017-01-06 111 142 128 129
2017-01-07 114 104 123 123
2017-01-08 141 149 130 132
2017-01-09 122 113 141 109
2017-01-10 107 122 101 100
2017-01-11 117 108 124 113
2017-01-12 147 142 108 130
以下函数可让您指定源数据帧以及因变量 y 以及一系列独立变量 x1,x2 。使用statsmodels,一些期望的结果将存储在数据帧中。在那里,R2将是数字类型,而回归系数和p值将是列表,因为这些估计的数量将随着您希望包含在分析中的独立变量的数量而变化。
def LinReg(df, y, x, const):
betas = x.copy()
# Model with out without a constant
if const == True:
x = sm.add_constant(df[x])
model = sm.OLS(df[y], x).fit()
else:
model = sm.OLS(df[y], df[x]).fit()
# Estimates of R2 and p
res1 = {'Y': [y],
'R2': [format(model.rsquared, '.4f')],
'p': [model.pvalues.tolist()],
'start': [df.index[0]],
'stop': [df.index[-1]],
'obs' : [df.shape[0]],
'X': [betas]}
df_res1 = pd.DataFrame(data = res1)
# Regression Coefficients
theParams = model.params[0:]
coefs = theParams.to_frame()
df_coefs = pd.DataFrame(coefs.T)
xNames = list(df_coefs)
xValues = list(df_coefs.loc[0].values)
xValues2 = [ '%.2f' % elem for elem in xValues ]
res2 = {'Independent': [xNames],
'beta': [xValues2]}
df_res2 = pd.DataFrame(data = res2)
# All results
df_res = pd.concat([df_res1, df_res2], axis = 1)
df_res = df_res.T
df_res.columns = ['results']
return(df_res)
这是一次试运行:
df_regression = LinReg(df = df, y = 'y', x = ['x1', 'x2'], const = True)
print(df_regression)
输出:
results
R2 0.3650
X [x1, x2]
Y y
obs 12
p [0.7417691742514285, 0.07989515781898897, 0.25...
start 2017-01-01 00:00:00
stop 2017-01-12 00:00:00
Independent [const, x1, x2]
coefficients [16.29, 0.47, 0.37]
这里有一个简单的复制粘贴的全部内容:
# Imports
import pandas as pd
import numpy as np
import statsmodels.api as sm
np.random.seed(1)
rows = 12
listVars= ['y','x1', 'x2', 'x3']
rng = pd.date_range('1/1/2017', periods=rows, freq='D')
df = pd.DataFrame(np.random.randint(100,150,size=(rows, len(listVars))), columns=listVars)
df = df.set_index(rng)
def LinReg(df, y, x, const):
betas = x.copy()
# Model with out without a constant
if const == True:
x = sm.add_constant(df[x])
model = sm.OLS(df[y], x).fit()
else:
model = sm.OLS(df[y], df[x]).fit()
# Estimates of R2 and p
res1 = {'Y': [y],
'R2': [format(model.rsquared, '.4f')],
'p': [model.pvalues.tolist()],
'start': [df.index[0]],
'stop': [df.index[-1]],
'obs' : [df.shape[0]],
'X': [betas]}
df_res1 = pd.DataFrame(data = res1)
# Regression Coefficients
theParams = model.params[0:]
coefs = theParams.to_frame()
df_coefs = pd.DataFrame(coefs.T)
xNames = list(df_coefs)
xValues = list(df_coefs.loc[0].values)
xValues2 = [ '%.2f' % elem for elem in xValues ]
res2 = {'Independent': [xNames],
'beta': [xValues2]}
df_res2 = pd.DataFrame(data = res2)
# All results
df_res = pd.concat([df_res1, df_res2], axis = 1)
df_res = df_res.T
df_res.columns = ['results']
return(df_res)
df_regression = LinReg(df = df, y = 'y', x = ['x1', 'x2'], const = True)
print(df_regression)
答案 1 :(得分:0)
您为每个日期拟合线性模型,因为ols将日期视为分类变量。我建议你试试:
est = smf.ols(formula='r ~ spend', data=df).fit()
print est.summary()
对于statsmodel尝试:
ar_model = sm.tsa.AR(df['spend'], freq='1')