【无标题】

2023-12-13 14:10:01

# -*- 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


?

文章来源:https://blog.csdn.net/weixin_45456209/article/details/134969379
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。