不平衡面板上一阶差分回归的残差
Residuals from first differenced regression on unbalanced panel
我正在尝试使用 plm 来估计一些不平衡面板数据的一阶差分模型。我的模型似乎有效并且我得到了系数估计值,但我想知道是否有办法获得每次观察的残差(或拟合值)。
我有 运行 两个问题,我不知道如何将残差附加到与之相关的观察,而且我得到的残差数量似乎不正确。
如果我使用 model.name$residuals 从估计模型中检索残差,我得到的向量比 model.name$model.
require(plm)
X <- rnorm(14)
Y <- c(.4,1,1.5,1.3,1,4,5,6.5,7.3,3.7,5,.7,4,6)
Time <- rep(1:5,times=2)
Time <- c(Time, c(1,2,4,5))
ID <- rep(1:2,each=5)
ID <- c(ID,c(3,3,3,3))
TestData <- data.frame("Y"=Y,"X"=X,"ID"=ID,"Time"=Time)
model.name <- plm(Y~X,data=TestData,index = c("ID","Time"),model="fd")
> length(model.name$residuals)
[1] 11
> nrow(model.name$model)
[1] 14
(注意:ID=3 缺少对 t=3 的观察)
查看 model.name$model 我发现它包含所有观察值,包括 ID 的每个成员的 t=1。在一阶差分中,t=1 的观测值将被删除,因此在这种情况下,所有时间段的两个 ID 都应该有 4 个来自剩余时间段的残差。 ID=3 对于 t=2 应该有一个残差,none 对于 t=3 因为它丢失了,none 对于 t=4 因为没有差异值(由于缺少 t=3值),然后是 t=5 的残差。
据此看来应该有 10 个残差,但我有 11 个。如果能帮助我解释为什么会有这么多残差,以及如何将残差连接到正确的索引(ID 和时间),我将不胜感激。
model="fd"
的滞后是基于相邻行,而不是时间索引的实际值。因此,如果您的时间段不连续,这会给您带来意想不到的结果。为避免这种情况,请自己进行差分,同时尊重滞后的时间段并估计 pooling 模型。数据不平衡这里不用担心
从包 plm
的 1.7.0 版开始,lag()
函数根据默认的时间段值执行滞后(以前的默认值是相邻行)。使用此功能自己做滞后。
继续你的例子:
pTestData <- pdata.frame(TestData, index=c("ID", "Time"))
pTestData$Y_diff <- plm::lag(pTestData$Y) - pTestData$Y
pTestData$X_diff <- plm::lag(pTestData$X) - pTestData$X
fdmod <- plm(Y_diff ~ X_diff, data = pTestData, model = "pooling")
length(residuals(fdmod)) # 10
nrow(fdmod$model) # 10
我在提到滞后函数时明确使用了 plm::
,因为其他几个包也有滞后函数(最显着的是 stats
和 dplyr
)并且您想使用一个来自 plm 包这里。
要将残差增加到差异数据(实际上用于计算模型),只需执行以下操作:
dat <- cbind(fdmod$model, residuals(fdmod))
此外,您可能对函数 is.pconsecutive
感兴趣
检查数据的连续性:
is.pconsecutive(pTestData)
# 1 2 3
# TRUE TRUE FALSE
函数 make.pconsecutive
将通过插入具有 NA
个值的行来使您的数据连续。
我正在尝试使用 plm 来估计一些不平衡面板数据的一阶差分模型。我的模型似乎有效并且我得到了系数估计值,但我想知道是否有办法获得每次观察的残差(或拟合值)。
我有 运行 两个问题,我不知道如何将残差附加到与之相关的观察,而且我得到的残差数量似乎不正确。
如果我使用 model.name$residuals 从估计模型中检索残差,我得到的向量比 model.name$model.
require(plm)
X <- rnorm(14)
Y <- c(.4,1,1.5,1.3,1,4,5,6.5,7.3,3.7,5,.7,4,6)
Time <- rep(1:5,times=2)
Time <- c(Time, c(1,2,4,5))
ID <- rep(1:2,each=5)
ID <- c(ID,c(3,3,3,3))
TestData <- data.frame("Y"=Y,"X"=X,"ID"=ID,"Time"=Time)
model.name <- plm(Y~X,data=TestData,index = c("ID","Time"),model="fd")
> length(model.name$residuals)
[1] 11
> nrow(model.name$model)
[1] 14
(注意:ID=3 缺少对 t=3 的观察)
查看 model.name$model 我发现它包含所有观察值,包括 ID 的每个成员的 t=1。在一阶差分中,t=1 的观测值将被删除,因此在这种情况下,所有时间段的两个 ID 都应该有 4 个来自剩余时间段的残差。 ID=3 对于 t=2 应该有一个残差,none 对于 t=3 因为它丢失了,none 对于 t=4 因为没有差异值(由于缺少 t=3值),然后是 t=5 的残差。
据此看来应该有 10 个残差,但我有 11 个。如果能帮助我解释为什么会有这么多残差,以及如何将残差连接到正确的索引(ID 和时间),我将不胜感激。
model="fd"
的滞后是基于相邻行,而不是时间索引的实际值。因此,如果您的时间段不连续,这会给您带来意想不到的结果。为避免这种情况,请自己进行差分,同时尊重滞后的时间段并估计 pooling 模型。数据不平衡这里不用担心
从包 plm
的 1.7.0 版开始,lag()
函数根据默认的时间段值执行滞后(以前的默认值是相邻行)。使用此功能自己做滞后。
继续你的例子:
pTestData <- pdata.frame(TestData, index=c("ID", "Time"))
pTestData$Y_diff <- plm::lag(pTestData$Y) - pTestData$Y
pTestData$X_diff <- plm::lag(pTestData$X) - pTestData$X
fdmod <- plm(Y_diff ~ X_diff, data = pTestData, model = "pooling")
length(residuals(fdmod)) # 10
nrow(fdmod$model) # 10
我在提到滞后函数时明确使用了 plm::
,因为其他几个包也有滞后函数(最显着的是 stats
和 dplyr
)并且您想使用一个来自 plm 包这里。
要将残差增加到差异数据(实际上用于计算模型),只需执行以下操作:
dat <- cbind(fdmod$model, residuals(fdmod))
此外,您可能对函数 is.pconsecutive
感兴趣
检查数据的连续性:
is.pconsecutive(pTestData)
# 1 2 3
# TRUE TRUE FALSE
函数 make.pconsecutive
将通过插入具有 NA
个值的行来使您的数据连续。