【无标题】
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels.stats.api as sms # import het_goldfeldquandt
from patsy import dmatrices
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
from patsy import dmatrices
from statsmodels.tsa.stattools import acf
class Regression:
? ? def __init__(self, x, y, data):#x,y 都是string
? ? ? ? self.xname=x
? ? ? ? self.yname=y
? ? ? ? self.data = data
? ? ? ? self.formular = self.yname+'~'+ self.xname ?
? ? ? ? self.y, self.X = dmatrices(self.formular,data=data,return_type='dataframe')
? ? ? ??
? ? ? ? self.model_ols = sm.OLS(self.y,self.X).fit()
? ? ? ? self.dias = {}
? ? ? ??
? ? ? ? norm =sms.jarque_bera(self.model_ols.resid)
? ? ? ? inds =sms.durbin_watson(self.model_ols.resid)
? ? ? ? hexe = sms.het_goldfeldquandt(self.model_ols.resid, self.model_ols.model.exog)
? ? ? ? white = sms.het_white(self.model_ols.resid, self.model_ols.model.exog)
? ? ? ??
? ? ? ? names = ['normal','independent','hetero','white']
? ? ? ? self.dias['name'] = self.xname
? ? ? ? self.dias[names[0]]=norm[1]
? ? ? ? self.dias[names[1]]=inds
? ? ? ? self.dias[names[2]]=hexe[1]
? ? ? ? self.dias[names[3]]=white[1]
? ? ? ??
? ? ? ? residuals = self.model_ols.resid
? ? ? ? x_plot = self.X[self.xname]
? ? ? ? plt.scatter(x_plot, residuals)
? ? ? ? plt.axhline(y=0, color='r', linestyle='-')
? ? ? ? plt.xlabel('X values')
? ? ? ? plt.ylabel('Residuals')
? ? ? ? plt.show()
? ? ? ??
? ? def wls(self,weights):
? ? ? ? self.model_wls = sm.WLS(self.y,self.X,weights =weights ).fit()
? ? ? ? print(self.model_wls.summary())
? ? ? ??
? ? def wls_linear(self):
? ? ? ? abs_resid = np.abs(self.model_ols.resid)
? ? ? ? data_new = self.data.assign(abs_resid=abs_resid)
? ? ? ? weight_ols = Regression('X','abs_resid',data_new)
? ? ? ? a,b = weight_ols.model_ols.params
? ? ? ? weights = 1/(a+b*x)**2
? ? ? ? self.model_wls_linear = sm.WLS(self.y,self.X,weights =weights ).fit()
? ? ? ? print(self.model_wls_linear.summary())
? ? def corelation(self):
? ? ? ? self.you = acf(self.model_ols.resid)[1]
? ? ? ? if self.xname in self.data.columns:
? ? ? ? ? ? a = self.data[self.yname][1:]-self.you*self.data[self.yname][:-1]
? ? ? ? ? ? b = self.data[self.xname][1:]-self.you*self.data[self.xname][:-1]
? ? ? ? ? ? data_new = pd.DataFrame({'X_star':b[1:-1],'Y_star':a[1:-1]})
? ? ? ? ? ? self.cor = ?Regression('X_star','Y_star',data_new)
? ? ? ? ? ? print(self.cor.model_ols.summary())
#引入库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from regression import Regression
# import statsmodels.api as sm
#使用class 做回归分析
r = Regression('hours','lwage',data)
print(r.model_ols.summary())
#解读一些参数,summary dias ?1 3如果>5% 通过检验 正态分布,同方差 第2个参数 大约等于2 ??
#非正态性处理,1增加数据量,2变换变量x y都可以变 3增加自变量,x的变换增加进去 ?x x^2?
#异方差处理 wls方法估计参数就可以
#第二参数不通过的处理,自相关
r.dias
?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!