当前位置:   article > 正文

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

分布滞后参数怎么估计

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

  1. import pandas as pd
  2. import numpy as np
  3. df=pd.DataFrame(pd.read_excel("D:\\jl\\8-2数据.xlsx"))
  4. print(df)
  5. y=df["purchase"]
  6. x=df["inventory"]
  7. x1=x.shift(1)#整体向下移动一次,滞后一期
  8. x2=x.shift(2)
  9. x3=x.shift(3)
  10. print(x1)
  11. W0=x+x1+x2+x3#W0=Σ(0,j=3)X(t-j)
  12. W1=0*x+1*x1+2*x2+3*x3#W1=Σ(0,j=3)j*X(t-j)
  13. W2=0*x+1*x1+4*x2+9*x3#W2=Σ(0,j=3)j^2*X(t-j)
  14. print(W0)#由于之前的滞后操作,W0,W1,W2的前三个数均为Nan
  15. import statsmodels.formula.api as smf
  16. data=pd.DataFrame({"Y":y[3:],"W0":W0[3:],"W1":W1[3:],"W2":W2[3:]})#构建数据框,并给每一列命名,将Nan的数据清除
  17. model1=smf.ols("Y~W0+W1+W2",data)
  18. fit1=model1.fit()
  19. print(fit1.summary())

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

方法一:

  1. t=3#设置滞后期数
  2. X=[]
  3. for i in range(t,len(x)):#滞后t期,会导致数据前有t个数据缺失,python下标从0开始,所以从t开始循环,range函数不包括右侧,len(x)刚好
  4. m=[]
  5. a=0
  6. b=0#上一个时间戳的数据清除
  7. c=0
  8. d=0#j=3
  9. for j in range(0,(t+1)):
  10. a=a+x[i-j]#计算W0,公式同上
  11. for j in range(0,(t+1)):
  12. b=b+j*x[i-j]#计算W1,公式同上
  13. for j in range(0,(t+1)):
  14. c=c+(j**2)*x[i-j]#计算W2,公式同上
  15. for j in range(0,(t+1)):
  16. d=d+(j**3)*x[i-j]#j=3时,计算W3
  17. m.append(a)
  18. m.append(b)#将时间戳为t时对应的W0,W1,W2放到同一个向量中
  19. m.append(c)
  20. m.append(d)#j=3
  21. X.append(m)#将时间戳为t时的数据保存,进入下一个循环计算时间戳t+1对应的数据
  22. import statsmodels.api as sm
  23. X=sm.add_constant(X)#加常数项
  24. print(X)
  25. model=sm.OLS(y[t:],X)#由于滞后,t之前的时间戳会出现Nan,从t开始,保持y与X的一致,X在循环时已经处理,此时不需要再次处理
  26. fit2=model.fit()#把模型的结果赋值给fit2
  27. print(fit2.summary())

方法二:

  1. t=3#设置滞后期数
  2. W0=[]
  3. W1=[]
  4. W2=[]
  5. #W3=[]
  6. for i in range(t,len(x)):#滞后t期,会导致数据前有t个数据缺失,python下标从0开始,所以从t开始循环,range函数不包括右侧,len(x)刚好
  7. a=0
  8. b=0#上一个时间戳的数据清除
  9. c=0
  10. #d=0#j=3
  11. for j in range(0,(t+1)):
  12. a=a+x[i-j]#计算W0,公式同上
  13. for j in range(0,(t+1)):
  14. b=b+j*x[i-j]#计算W1,公式同上
  15. for j in range(0,(t+1)):
  16. c=c+(j**2)*x[i-j]#计算W2,公式同上
  17. #for j in range(0,(t+1)):
  18. #d=d+(j**3)*x[i-j]#j=3时,计算W3
  19. W0.append(a)
  20. W1.append(b)#将时间戳为t时对应的W0,W1,W2放到同一个向量中
  21. W2.append(c)
  22. #W3.append(d)#j=3
  23. import statsmodels.formula.api as smf
  24. data=pd.DataFrame({"Y":y[3:],"W0":W0,"W1":W1,"W2":W2})#构建数据框,并给每一列命名,使y的数据个数与W0,W1,W2保持一致
  25. model1=smf.ols("Y~W0+W1+W2",data)
  26. # data=pd.DataFrame({"Y":y[3:],"W0":W0,"W1":W1,"W2":W2,"W3":W3})#构建数据框,并给每一列命名,使y的数据个数与W0,W1,W2保持一致
  27. # model1=smf.ols("Y~W0+W1+W2+W3",data)
  28. fit1=model1.fit()
  29. print(fit1.summary())

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/358872
推荐阅读
相关标签
  

闽ICP备14008679号