【问题标题】:ADL(2,2) modelling in R with differenced variables and lagsR中的ADL(2,2)建模具有不同的变量和滞后
【发布时间】:2016-10-25 22:55:34
【问题描述】:

我是时间序列分析的新手,我正在尝试基于一个非常简单的数据集对这种关系进行建模,该数据集仅包含两个时间序列:销售百分比变化 - 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*time + 误差

以及对应的R语法:

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

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

错误: all(sapply(args, function(x) is.zoo(x) || !is.plain(x) || (is.plain(x) && .... 不正确

我的语法有什么问题吗?我在这里想念什么?我什至不确定问题出在语法上还是我对回归公式的理解上。

提前致谢!

【问题讨论】:

  • 至少需要显示 str(df) 和 ... 请不要在 cmets 中回答。
  • 好的,我添加了它@42-

标签: r statistics time-series lag


【解决方案1】:

来自 dynlm 包的 documentation,它说您需要将列设置为时间序列格式才能使用内置的 dynlm 函数“d”和“L”。

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

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

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

手动创建列后,我尝试使用基本“lm”函数复制结果,回归系数相同。一个区别在于数据论点。对于 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

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

【讨论】:

  • 有趣。我会认为在预测 sales_delta 时同时包含 lag(sales) 和 lag(sales_delta) 可能会造成过度确定的情况。将动物园对象创建为数据框结构内的单独实体似乎也很令人惊讶。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 2015-10-29
  • 2018-07-04
相关资源
最近更新 更多