我是时间序列分析的新手,我正在尝试根据一个非常简单的数据集来建模这种关系,这个数据集只包含两个时间序列:销售额的百分比变化 - 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; ....不是真的
我的语法有什么问题吗?我在这里错过了什么?我甚至不确定问题是关于语法还是我对回归公式的理解。
提前致谢!
答案 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
希望这会有所帮助。一般来说,我建议坚持使用基本功能,并仅在需要时使用包。