回归分析与模型诊断——作业

作业1:含二次项/对数项模型的讨论

我们想要探究婴儿出生的体重与何种因素相关,数据集为bwght2.dta,本次习题所使用的变量解释如下:
因变量:
· bwght:婴儿出生体重

自变量:
· npvis:母亲产前检查次数
· mage:母亲年龄

使用python进行实操并回答以下问题

(1):使用OLS估计方程
log ⁡ ( b w g h t ) = β 0 + β 1 n p v i s + β 2 n p v i s 2 + u \log (b w g h t)=\beta_{0}+\beta_{1} n p v i s+\beta_{2} n p v i s^{2}+u log(bwght)=β0+β1npvis+β2npvis2+u
输出报告表,并回答:自变量npvis的二次项是否显著?自变量npvis是否对因变量有显著影响?

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
import seaborn as sns
from IPython.display import display
import statsmodels.api as sm
# 加载数据
bwght2=pd.read_stata('./bwght2.dta')
bwght2.head()

在这里插入图片描述

bwght2_lm=sm.formula.ols('np.log(bwght)~npvis + I(npvis**2)',data=bwght2).fit()
print(bwght2_lm.summary())

在这里插入图片描述
自变量npvis的二次项显著,自变量npvis对因变量有显著影响。

(2):基于(1)的方程,我们认为最大化log(bwght)的产前检查次数npvis约为24,其理论依据是什么?
对(1)的npvis进行求导,并令导数等于0,可得
β 1 + 2 β 2 n p v i s = 0 \beta_{1}+2\beta_{2} n p v i s=0 β1+2β2npvis=0
代入可得
n p v i s = 23.625 n p v i s=23.625 npvis=23.625
所以最大化log(bwght)的产前检查次数npvis约为24。

(3):按照这个模型的结果,在24次产前检查后婴儿出生体重会下降,这是为什么?你认为这有实际意义吗?这蕴含了一个含二次项变量模型的常见陷阱,请仔细思考!

这种结果是因为遗漏变量导致的。注意到R方只有0.021,模型的拟合效果很差,应该是有很多相关变量没有被纳入。可能存在某种变量,同时影响产检次数和婴儿出生体重。

(4):在模型中加入母亲年龄变量及其二次形式。回答:保持npvis不变,母亲在什么生育年龄时,孩子出生体重最大?大于这个年龄时,孩子出生体重下降,这是否具有实际意义呢?请结合问题(3)思考这一问题。

bwght2_lm2=sm.formula.ols('np.log(bwght)~npvis + I(npvis**2) + mage + I(mage**2)',data=bwght2).fit()
print(bwght2_lm2.summary())

在这里插入图片描述
保持npvis不变,母亲在生育年龄47.46(0.0009/(9.481e-06*2))时,孩子出生体重最大。这并没有实际意义。因为这个模型并不正确,特别是mage的一次项、二次项的系数都不显著,并且模型的R方也很小。说明有很多的遗漏变量,影响到所考虑的变量。

(5):(4)中的模型能否解释log(gwght)大部分变异?
不能,因为R方非常小,说明了这一点。

作业2:异方差模型的讨论

紧接着example13(主管人数与工人人数间关系的问题),我们对异方差问题进行更进一步的探讨。

使用python进行实操并回答以下问题

(1):在假设方差形式为 Var ⁡ ( u ∣ x ) = σ 2 x 2 \operatorname{Var}(u \mid x)=\sigma^{2} x^{2} Var(ux)=σ2x2并进行wls估计后,比较wls估计与ols估计的残差图,回答:异方差消除了吗?

# 载入数据集
data=pd.read_table('./P176.txt')
data.head()

在这里插入图片描述

# 查看ols估计的残差与X的散点图
fig=plt.figure(figsize=(13,6))
ax1=fig.add_subplot(1,2,1)
data_lm=sm.formula.ols('Y~X',data=data).fit()
plt.scatter(data.X,data_lm.resid,axes=ax1)
ax1.set_xlabel('X')
ax1.set_ylabel('resid_ols')
ax1.set_title('resid_ols | X')

# 查看wls估计的残差与X的散点图
ax2=fig.add_subplot(1,2,2)
data_lm_wls=sm.formula.wls('Y~X',weights=1/data.X**2,data=data).fit()
plt.scatter(data.X,data_lm_wls.resid,axes=ax2)
ax2.set_xlabel('X')
ax2.set_ylabel('resid_wls')
ax2.set_title('resid_wls | X')

在这里插入图片描述
使用wls估计,异方差并没有消除。

(2):使用FGLS估计对该模型进行重新估计,观察残差图并回答:异方差消除了吗?

data['resid']=data_lm.resid

# 进行辅助回归
data_lm_log=sm.formula.ols('np.log(resid**2)~X',data=data).fit()
h_hat=np.exp(data_lm_log.fittedvalues)

# 进行wls检验
data_lm_fgls=sm.formula.wls('Y~X',weights=1/h_hat,data=data).fit()

# 查看ols估计的残差与X的散点图
fig=plt.figure(figsize=(13,6))
ax1=fig.add_subplot(1,2,1)
data_lm=sm.formula.ols('Y~X',data=data).fit()
plt.scatter(data.X,data_lm.resid,axes=ax1)
ax1.set_xlabel('X')
ax1.set_ylabel('resid_ols')
ax1.set_title('resid_ols | X')

# 查看fgls估计的残差与X的散点图
ax2=fig.add_subplot(1,2,2)
plt.scatter(data.X,data_lm_fgls.resid,axes=ax2)
ax2.set_xlabel('X')
ax2.set_ylabel('resid_fgls')
ax2.set_title('resid_fgls | X')

在这里插入图片描述
使用FGLS估计,异方差并没有消除。

(3):画出log(Y)与X的散点图,观察方差的状况,说说你的发现;根据散点图的情况,请大胆假设一个你认为正确的模型。

# 直接看log(Y)与X的散点图
fig=plt.figure()
plt.scatter(data.X,np.log(data.Y))
ax1.set_xlabel('X')
ax1.set_ylabel('Y')
ax1.set_title('log(Y) | X')

在这里插入图片描述
发现log(Y)在X上异方差情况不明显。
假设模型是
log ⁡ ( Y ) = β 0 + β 1 X + β 2 X 2 + u \log (Y)=\beta_{0}+\beta_{1} X+\beta_{2} X^2+u log(Y)=β0+β1X+β2X2+u

data_lm_logy=sm.formula.ols('np.log(Y)~X+I(X**2)',data=data).fit()
print(data_lm_logy.summary())

在这里插入图片描述
各变量系数均显著,R方也很大。

(4):考虑新模型
log ⁡ ( Y ) = β 0 + β 1 X + β 2 X 2 + u \log (Y)=\beta_{0}+\beta_{1} X+\beta_{2} X^2+u log(Y)=β0+β1X+β2X2+u
使用ols估计该模型,并画出残差散点图,说说你的发现

估计结果如上。

# 查看ols估计的残差与X的散点图
fig=plt.figure(figsize=(13,6))
ax1=fig.add_subplot(1,2,1)
data_lm=sm.formula.ols('Y~X',data=data).fit()
plt.scatter(data.X,data_lm.resid,axes=ax1)
ax1.set_xlabel('X')
ax1.set_ylabel('resid_ols')
ax1.set_title('resid_ols | X')

# 查看ols估计log(Y)的残差与X的散点图
ax2=fig.add_subplot(1,2,2)
data_lm_logy=sm.formula.ols('np.log(Y)~X+I(X**2)',data=data).fit()
plt.scatter(data.X,data_lm_logy.resid,axes=ax2)
ax2.set_xlabel('X')
ax2.set_ylabel('resid_log(Y)_ols')
ax2.set_title('resid_log(Y) | X')

在这里插入图片描述
发现对因变量取log再回归后,异方差的现象消失了。

(5):综合以上四个问题,谈谈你对纠正模型异方差的见解。

异方差模型有可能是因为模型设计不合理造成的。在这种情况下,即使采用wls或者FGLS估计,也不一定能够消除异方差现象。当出现残差的方差随着自变量变大而变大的现象时,可以考虑对因变量取对数后再回归,可以很好地缓解异方差程度。

感谢Datawhale
感谢Gitmodel
参考文献
【教程地址】https://github.com/Git-Model/Modeling-Universe/tree/main/Data%20Analysis%20and%20Statistical%20Modeling
【备用gitee地址】https://gitee.com/mr-yinbob/Modeling-Universe/tree/main/Data%20Analysis%20and%20Statistical%20Modeling

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值