AD中的ADL(2,2)建模具有不同的变量和滞后

时间:2016-10-25 22:55:34

标签: r statistics time-series lag

我是时间序列分析的新手,我正在尝试根据一个非常简单的数据集来建模这种关系,这个数据集只包含两个时间序列:销售额的百分比变化 - y ,在百分比变化上回归在购买 - x 和确定性趋势。

'data.frame':   98 obs. of  3 variables:
 $ time         : int  1 2 3 4 5 6 7 8 9 10 ...
 $ sales        : num  3.18 4.59 5.41 5.68 4.62 ...
 $ comppurchases: num  1.675 0.246 0.333 0.969 0.147 ...

数据集基于书中的示例,因此我试图根据书中提供的输出找出回归公式。作者将y_(t-1),Δy_t-1,x_t,Δx_t,Δx_t-1和时间的系数表示为解释变量。

这将是我的等式:

  

Δy_t= a +φ y_(t-1)+λΔy_t-1 +β x_t +β1Δx_t+β2*Δx_t-1 + + d *时间+错误

和相应的R语法:

regr <- dynlm(d(sales) ~ L(sales,1)+L(d(sales))+ comppurchases +d(comppurchases)+L(d(comppurchases)) + time, data=df)

问题是,每当我运行语法时,都会收到此错误:

  

错误:全部(sapply(args,function(x)is.zoo(x)||!is.plain(x)||   (is.plain(x)&amp;&amp; ....不是真的

我的语法有什么问题吗?我在这里错过了什么?我甚至不确定问题是关于语法还是我对回归公式的理解。

提前致谢!

1 个答案:

答案 0 :(得分:2)

来自dynlm软件包的documentation,它表示您需要使用时间序列格式的列来使用内置的dynlm函数&#34; d&#34;和&#34; L&#34;。

  

所有新的公式函数都要求它们的参数是时间序列   对象(即&#34; ts&#34;或&#34; zoo&#34;)。

首先,我认为销售和采购是原始数据,而不是百分比变化。如果不是这样,那么您可以根据自己的需要进行调整。

在创建新列后,该功能的作用是销售额的百分比变化,&#34; sales_delta&#34;并在回归中使用它而不是内置函数&#34; d(数据,滞后)&#34;。我无法使用此功能。

我尝试用基础复制结果&#34; lm&#34;手动创建列后的函数,回归系数相同。一个不同之处在于数据论证。对于lm,我必须指定忽略具有NA值的前2列,而dynlm包具有省略具有NA值的行的默认方法。

time = seq(1,11,1)
sales = c(3.18, 4.59, 5.41, 5.68, 4.62, 5.08, 6.02, 6.15, 5.99, 6.03, 6.05)
purch = c(1.675, 0.246, 0.333, 0.969, 0.147, 0.258, 0.65, 0.85, 0.25, 0.11, 0.25)
require(zoo)

df = data.frame(time = time, sales = sales, purch = purch)
df$sales = zoo(df$sales)
df$purch = zoo(df$purch)

df$sales_lag1 = NA
df$sales_lag1[2:nrow(df)] = df$sales[1:nrow(df)-1]
df$sales_delta = df$sales/df$sales_lag1 - 1
df$sales_delta_lag1 = NA
df$sales_delta_lag1[3:nrow(df)] = df$sales_delta[2:(nrow(df)-1)]

df$purch_lag1 = NA
df$purch_lag1[2:nrow(df)] = df$purch[1:nrow(df)-1]
df$purch_delta = df$purch/df$purch_lag1 - 1
df$purch_delta_lag1 = NA
df$purch_delta_lag1[3:nrow(df)] = df$purch_delta[2:(nrow(df)-1)]

mod_base = lm(sales_delta ~ sales_lag1 + sales_delta_lag1 + purch +      purch_delta + purch_delta_lag1 + time, data = df[-c(1:2),])
summary(mod_base)

require(dynlm)
mod_dynlm = dynlm(sales_delta ~ L(sales,1) + L(sales_delta,1) + purch +  purch_delta + L(purch_delta,1) + time, data = df)


#Check if results are similar
mod_base$coefficients == mod_dynlm$coefficients

希望这会有所帮助。一般来说,我建议坚持使用基本功能,并仅在需要时使用包。