Python有限分布滞后模型参数的估计——阿尔蒙多项式

本文介绍了如何使用Python代替Eviews进行阿尔蒙多项式计算,通过创建数据框、滞后变量并构建线性模型。作者分享了两种方法,分别通过循环计算和列表推导实现W0、W1、W2等项,然后利用statsmodels库进行回归分析,展示了将统计方法手动编程的过程。
摘要由CSDN通过智能技术生成

接上一篇文章,我们学校的计量经济学是按Eviews讲的,近期和老师一起探索用Python来写代码,原本这个实验是用Eviews中阿尔蒙多项式做的,但我在网上搜集资料时并没有看到直接进行阿尔蒙变化的函数,所以自己写了两段代码来实现。

import pandas as pd
import numpy as np

df=pd.DataFrame(pd.read_excel("D:\\jl\\8-2数据.xlsx"))
print(df)

y=df["purchase"]
x=df["inventory"]
x1=x.shift(1)#整体向下移动一次,滞后一期
x2=x.shift(2)
x3=x.shift(3)
print(x1)
W0=x+x1+x2+x3#W0=Σ(0,j=3)X(t-j)
W1=0*x+1*x1+2*x2+3*x3#W1=Σ(0,j=3)j*X(t-j)
W2=0*x+1*x1+4*x2+9*x3#W2=Σ(0,j=3)j^2*X(t-j)
print(W0)#由于之前的滞后操作,W0,W1,W2的前三个数均为Nan

import statsmodels.formula.api as smf
data=pd.DataFrame({"Y":y[3:],"W0":W0[3:],"W1":W1[3:],"W2":W2[3:]})#构建数据框,并给每一列命名,将Nan的数据清除
model1=smf.ols("Y~W0+W1+W2",data)
fit1=model1.fit()
print(fit1.summary())

以上是为了完成实验内容,下面是我写的关于阿尔蒙变换的部分。

方法一:

t=3#设置滞后期数
X=[]
for i in range(t,len(x)):#滞后t期,会导致数据前有t个数据缺失,python下标从0开始,所以从t开始循环,range函数不包括右侧,len(x)刚好
    m=[]
    a=0
    b=0#上一个时间戳的数据清除
    c=0
    d=0#j=3时
    for j in range(0,(t+1)):
        a=a+x[i-j]#计算W0,公式同上
    for j in range(0,(t+1)):
        b=b+j*x[i-j]#计算W1,公式同上
    for j in range(0,(t+1)):
        c=c+(j**2)*x[i-j]#计算W2,公式同上
    for j in range(0,(t+1)):
        d=d+(j**3)*x[i-j]#j=3时,计算W3
    m.append(a)
    m.append(b)#将时间戳为t时对应的W0,W1,W2放到同一个向量中
    m.append(c)
    m.append(d)#j=3时
    X.append(m)#将时间戳为t时的数据保存,进入下一个循环计算时间戳t+1对应的数据

import statsmodels.api as sm
X=sm.add_constant(X)#加常数项
print(X)
model=sm.OLS(y[t:],X)#由于滞后,t之前的时间戳会出现Nan,从t开始,保持y与X的一致,X在循环时已经处理,此时不需要再次处理
fit2=model.fit()#把模型的结果赋值给fit2
print(fit2.summary())

方法二:

t=3#设置滞后期数
W0=[]
W1=[]
W2=[]
#W3=[]
for i in range(t,len(x)):#滞后t期,会导致数据前有t个数据缺失,python下标从0开始,所以从t开始循环,range函数不包括右侧,len(x)刚好
    a=0
    b=0#上一个时间戳的数据清除
    c=0
    #d=0#j=3时
    for j in range(0,(t+1)):
        a=a+x[i-j]#计算W0,公式同上
    for j in range(0,(t+1)):
        b=b+j*x[i-j]#计算W1,公式同上
    for j in range(0,(t+1)):
        c=c+(j**2)*x[i-j]#计算W2,公式同上
    #for j in range(0,(t+1)):
        #d=d+(j**3)*x[i-j]#j=3时,计算W3
    W0.append(a)
    W1.append(b)#将时间戳为t时对应的W0,W1,W2放到同一个向量中
    W2.append(c)
    #W3.append(d)#j=3时

import statsmodels.formula.api as smf
data=pd.DataFrame({"Y":y[3:],"W0":W0,"W1":W1,"W2":W2})#构建数据框,并给每一列命名,使y的数据个数与W0,W1,W2保持一致
model1=smf.ols("Y~W0+W1+W2",data)
# data=pd.DataFrame({"Y":y[3:],"W0":W0,"W1":W1,"W2":W2,"W3":W3})#构建数据框,并给每一列命名,使y的数据个数与W0,W1,W2保持一致
# model1=smf.ols("Y~W0+W1+W2+W3",data)
fit1=model1.fit()
print(fit1.summary())

方法一和方法二的逻辑上是差不多的,但现在这两段代码只是实现了基本功能,但并不智能,为了改变j(W0,W1~Wj)还需要手动调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值