如何在R中存在恒定和线性时间趋势的情况下运行回归?

时间:2014-09-15 15:02:10

标签: r regression linear-regression lm

我有2个时间序列X和Y.

我已经知道如何在存在常数的情况下运行回归,由下式表示:

enter image description here

上面显示的回归(常数等式)我通过运行代码来模拟:

model_1 <- lm(y ~ x)
summary(model_1)

但是,我想在存在恒定和线性时间趋势的情况下运行回归,由以下等式表示

enter image description here

我应该使用什么代码才能在R中运行这种回归?

非常感谢任何协助。

1 个答案:

答案 0 :(得分:3)

Roland,你的基线解决了&#34;时间趋势增加&#34;以编程方式和非编程方式的问题:以下是我的包adfcs中的causfinder函数(用于条件和部分格兰杰因果关系的系统分析的包):

我已经编写了 A 分段 D ickey- F 更强的测试代码,其中考虑了相同(通用)的用法自动回归过程的所有滞后序列的子样本技术信息:在计量经济学的所有滞后选择程序中,必须使用相同的子样本来确定正确的最优值最小滞后)。有关下面的ct案例,请参阅seq_along:

adfcs <- function(t, max = floor(12*(length(t)/100)^(1/4)), type = c("c")) {
x <- ts(t)
x1d <- diff(x, differences=1)
x1l <- lag(x, -1)

x_names <- c("x1d", "x1l", sapply(1:max, function(i) paste("x1d", i, "l", sep="")))
for (i in as.integer(1:max)) { assign(x_names[i+2], lag(x1d, -i)) }
DLDlag <- do.call(ts.intersect, sapply(x_names, as.symbol))
DLDlag.df <- data.frame(DLDlag, obspts = c(time(DLDlag)))
DifferenceLags <- as.vector(names(DLDlag.df), mode="any")[3: (length(DLDlag.df)-1)]

lmresults <- array(list())
SBCvalues <- array(list())
AICvalues <- array(list())

for (i in as.integer(0:max)) {  

if (type==c("nc")) {    
if (i == 0) { lmresults[[max+1]] <- lm(as.formula(paste("x1d ~x1l")),data=DLDlag.df) 
SBCvalues[[max+1]] <- BIC(lmresults[[max+1]])
AICvalues[[max+1]] <- AIC(lmresults[[max+1]]) }
if (i > 0) { lmresults[[i]] <- lm(as.formula(paste("x1d ~ x1l+", paste(DifferenceLags[1:i], collapse="+"))),data=DLDlag.df) 
SBCvalues[[i]] <- BIC(lmresults[[i]])
AICvalues[[i]] <- AIC(lmresults[[i]]) }
}

if (type==c("c")) {     
if (i == 0) { lmresults[[max+1]] <- lm(as.formula(paste("x1d ~1+x1l")),data=DLDlag.df) 
SBCvalues[[max+1]] <- BIC(lmresults[[max+1]])
AICvalues[[max+1]] <- AIC(lmresults[[max+1]]) }
if (i > 0) { lmresults[[i]] <- lm(as.formula(paste("x1d ~ 1+x1l+", paste(DifferenceLags[1:i], collapse="+"))),data=DLDlag.df) 
SBCvalues[[i]] <- BIC(lmresults[[i]])
AICvalues[[i]] <- AIC(lmresults[[i]]) }
}

if (type==c("ct")) {    
if (i == 0) { lmresults[[max+1]] <- lm(as.formula(paste("x1d ~ 1+x1l+seq_along(x1d)",collapse="")),data=DLDlag.df) 
SBCvalues[[max+1]] <- BIC(lmresults[[max+1]])
AICvalues[[max+1]] <- AIC(lmresults[[max+1]]) }
if (i > 0) { lmresults[[i]] <- lm(as.formula(paste("x1d ~ 1+x1l+seq_along(x1d)+",paste(DifferenceLags[1:i], collapse="+"))),data=DLDlag.df) 
SBCvalues[[i]] <- BIC(lmresults[[i]])
AICvalues[[i]] <- AIC(lmresults[[i]]) }
}

}

list(which.min(SBCvalues), which.min(AICvalues))
as.data.frame(cbind(SBCvalues, AICvalues)) 
typespecified <- type
if (which.min(SBCvalues)==max+1) {
scs <- (max+2)-(0+1)
adfcs <- unitrootTest(x[scs:length(x)], lags = 0, type = typespecified)  
} else {
scs <- (max+2)-(which.min(SBCvalues)+1)
adfcs <- unitrootTest(x[scs:length(x)], lags =which.min(SBCvalues), type = typespecified)
 }
adfcs 
}

注意:非编程地添加时间趋势:

  

x < - rnorm(10)
  x1l < - lag(x,-1)
  lm(x~1 + x1l + seq_along(x))
      #Call:
      #lm(formula = x~1 + x1l + seq_along(x))
      #系数:       #(拦截)x1l seq_along(x)
      #-2.107e-16 1.000e + 00 2.645e-17

.....我检查了adfcs,当Eviews进行了正确的计算时,它给出了与Eviews相同的结果:
在Eviews(版本&lt; = 7.2)中注意:,ADF测试中不使用相同(常见)子样本,因此Eviews的ADF错误!在Eviews中正确和正确地实现上述代码是:

1。双击变量;视图;单位根检验; ADF; &#34;电平,截距&#34 ;;滞后长度:自动选择Schwarz:最大滞后= 14 &#34;。 (14根据数据集的变化)

2. 通过删除第一个样本来安排子样本:假设数据是1960Q1 2009Q4(200 obs)。然后从样本中移除第一个 14 + 1 obs:样本 - 样本范围对:1963Q4 2009Q4。在提供相同的子样本后,将执行ADF。

3. 再次双击同一个变量;视图;单位根检验; ADF; &#34;电平,截距&#34 ;;滞后长度:自动选择Schwarz:最大滞后= 14 &#34;。 (由于子采样的影响,此处可能出现不同于14的不同数字;在框中删除该数字,然后键入14)。按OK。