当我运行下面的代码时,一切都按预期工作
# install.packages("dynlm")
# install.packages("tidyr")
require(dynlm)
require(tidyr)
Time <- 1950:1993
Y <- c(5820, 5843, 5917, 6054, 6099, 6365, 6440, 6465, 6449, 6658, 6698, 6740, 6931,
7089, 7384, 7703, 8005, 8163, 8506, 8737, 8842, 9022, 9425, 9752, 9602, 9711,
10121, 10425, 10744, 10876, 10746, 10770, 10782, 11179, 11617, 12015, 12336,
12568, 12903, 13029, 13093, 12899, 13110, 13391)
X <- c(6284, 6390, 6476, 6640, 6628, 6879, 7080, 7114, 7113, 7256, 7264, 7382, 7583, 7718,
8140, 8508, 8822, 9114, 9399, 9606, 9875, 10111, 10414, 11013, 10832, 10906, 11192,
11406, 11851, 12039, 12005, 12156, 12146, 12349, 13029, 13258, 13552, 13545, 13890,
14005, 14101, 14003, 14279, 14341)
data <- data.frame(Time, Y, X)
data_ts <- ts(data, start = 1950, end = 1993, frequency = 1)
Modell <- dynlm(log(Y) ~ log(X) + log(L(X)) + log(L(X, 2)) + log(L(X, 3))
+ log(L(X, 4)) + log(L(X, 5)), data = data_ts)
summary(Modell)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我的摘要输出是这样的
...
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.059109 0.091926 -0.643 0.525
log(X) 0.883020 0.145754 6.058 9.17e-07 ***
log(L(X)) 0.004167 0.211420 0.020 0.984
log(L(X, 2)) -0.092880 0.207026 -0.449 0.657
log(L(X, 3)) -0.012016 0.210395 -0.057 0.955
log(L(X, 4)) 0.200596 0.212370 0.945 0.352
log(L(X, 5)) 0.014497 0.144103 0.101 0.920
...
Run Code Online (Sandbox Code Playgroud)
现在,当我使用gather()为一些图定义一个新的数据框时
data_tidyr <- gather(data, "Key", "Value", -Time)
Run Code Online (Sandbox Code Playgroud)
并重新运行上面的代码不改变任何其他我得到这个摘要:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.05669 0.07546 -0.751 0.457
log(X) 0.82128 0.13486 6.090 3.53e-07 ***
log(L(X)) 0.17484 0.13365 1.308 0.198
log(L(X, 2)) NA NA NA NA
log(L(X, 3)) NA NA NA NA
log(L(X, 4)) NA NA NA NA
log(L(X, 5)) NA NA NA NA
Run Code Online (Sandbox Code Playgroud)
我对这种行为感到困惑,因为收集操作(定义一个新的数据框,其中列聚集成行)与我用于运行回归的数据集无关(至少这是我的印象).以某种方式使用gather()改变了计算的方式,但我看不出如何.非常感谢帮助!
一些数字:
好的,谢谢你到目前为止的所有答案和评论,但问题仍然存在:环境中发生了什么?我想知道为什么以及如何发生这种情况.对我而言,这是一件非常严肃的事情,因为我的理解是避免一个函数调用对其他函数的非预期副作用,这正是R正在试图实现的函数式语言.现在,除非我在这里遗漏了一些东西,否则这种行为似乎与这种意图不一致.
这种意外更改的根本原因是dplyr(dplyr,而不是tidyr)更改了lag函数的默认方法.该gather函数调用dplyr::select_vars,它加载dplyr通过命名空间和覆盖lag.default.
在公式中使用时,dynlm函数会在内部调用.然后发现方法dispatch .当通过命名空间加载时(甚至不需要附加),找到了from .lagLlag.defaultdplyrlag.defaultdplyr
两个滞后函数根本不同.在新的R会话中,您会发现以下差异:
lag(1:3, 1)
## [1] 1 2 3
## attr(,"tsp")
## [1] 0 2 1
invisible(dplyr::mutate) # side effect: loads dplyr via namespace...
lag(1:3, 1)
## [1] NA 1 2
Run Code Online (Sandbox Code Playgroud)
所以解决方案相当简单.只是lag.default自己覆盖这个功能.
lag.default <- stats:::lag.default
dynlm(log(Y) ~ log(X) + log(L(X)) + log(L(X, 2)), data = data_ts)
## Time series regression with "ts" data:
## Start = 1952, End = 1993
##
## Call:
## dynlm(formula = log(Y) ~ log(X) + log(L(X)) + log(L(X, 2)), data = data_ts)
##
## Coefficients:
## (Intercept) log(X) log(L(X)) log(L(X, 2))
## -0.05476 0.83870 0.01818 0.13928
lag.default <- dplyr:::lag.default
dynlm(log(Y) ~ log(X) + log(L(X)) + log(L(X, 2)), data = data_ts)
## Time series regression with "ts" data:
## Start = 1951, End = 1993
##
## Call:
## dynlm(formula = log(Y) ~ log(X) + log(L(X)) + log(L(X, 2)), data = data_ts)
##
## Coefficients:
## (Intercept) log(X) log(L(X)) log(L(X, 2))
## -0.05669 0.82128 0.17484 NA
lag.default <- stats:::lag.default
dynlm(log(Y) ~ log(X) + log(L(X)) + log(L(X, 2)), data = data_ts)
## Time series regression with "ts" data:
## Start = 1952, End = 1993
##
## Call:
## dynlm(formula = log(Y) ~ log(X) + log(L(X)) + log(L(X, 2)), data = data_ts)
##
## Coefficients:
## (Intercept) log(X) log(L(X)) log(L(X, 2))
## -0.05476 0.83870 0.01818 0.13928
Run Code Online (Sandbox Code Playgroud)