是否有可能以某种方式使用适合对象,特别是我从plm()
模型得到的回归对象,用于标记用于回归的数据中的观察结果,如果它们实际上用于回归。我意识到这可以在我原始数据中寻找完整的观察时完成,但我很好奇是否有办法使用fit / reg对象来标记数据。
让我用最小的工作示例来说明我的问题,
首先需要一些包,
# install.packages(c("stargazer", "plm", "tidyverse"), dependencies = TRUE)
library(plm); library(stargazer); library(tidyverse)
第二个数据,这个例子很大程度上依赖于Baltagi(2013),表3.1,在?plm
中找到,
data("Grunfeld", package = "plm")
dta <- Grunfeld
现在我在我的数据对象dta
dta[c(3:13),3] <- NA; dta[c(22:28),4] <- NA; dta[c(30:33),5] <- NA
数据准备的最后一步是使用tidyverse,
创建一个带有索引属性的数据框,该索引属性描述其个人和时间维度dta.p <- dta %>% group_by(firm, year)
现在回归
plm.reg <- plm(inv ~ value + capital, data = dta.p, model = "pooling")
结果,使用stargazer,
stargazer(plm.reg, type="text") # stargazer(dta, type="text")
#> ============================================
#> Dependent variable:
#> ---------------------------
#> inv
#> ----------------------------------------
#> value 0.114***
#> (0.008)
#>
#> capital 0.237***
#> (0.028)
#>
#> Constant -47.962***
#> (9.252)
#>
#> ----------------------------------------
#> Observations 178
#> R2 0.799
#> Adjusted R2 0.797
#> F Statistic 348.176*** (df = 2; 175)
#> ===========================================
#> Note: *p<0.1; **p<0.05; ***p<0.01
说我知道我的数据有200个观察结果,我想找到回归中使用的178个数据。
我在猜测plm.reg
中是否有一些向量我可以(轻松)使用我的原始数据dta
来标记一个标志,如果使用/不使用此观察结果,即半 - 我在上面创建的随机缺失值。也许有些broom喜欢工具。
我想象的是,
dta <- dta %>% valid_reg_obs(plm.reg)
期望的结果看起来像这样,新元素最后是向量plm.reg
,即
dta %>% as_tibble()
#> # A tibble: 200 x 6
#> firm year inv value capital plm.reg
#> * <int> <int> <dbl> <dbl> <dbl> <lgl>
#> 1 1 1935 318 3078 2.80 T
#> 2 1 1936 392 4662 52.6 T
#> 3 1 1937 NA 5387 157 F
#> 4 1 1938 NA 2792 209 F
#> 5 1 1939 NA 4313 203 F
#> 6 1 1940 NA 4644 207 F
#> 7 1 1941 NA 4551 255 F
#> 8 1 1942 NA 3244 304 F
#> 9 1 1943 NA 4054 264 F
#> 10 1 1944 NA 4379 202 F
#> # ... with 190 more rows
更新,我尝试使用broom的augment()
,但不幸的是它给了我错误信息,我希望会创建一些标记,
# install.packages(c("broom"), dependencies = TRUE)
library(broom)
augment(plm.reg, dta)
#> Error in data.frame(..., check.names = FALSE) :
#> arguments imply differing number of rows: 200, 178
答案 0 :(得分:1)
向量为plm.reg$residuals
。不确定一个不错的broom
解决方案,但这似乎有效:
library(tidyverse)
dta.p %>%
as.data.frame %>%
rowid_to_column %>%
mutate(plm.reg = rowid %in% names(plm.reg$residuals))
对于使用类pdata.frame()
来创建描述其个人和时间维度的索引属性的人,您可以使用以下代码,这来自?plm
中的另一个Baltagi,
# == Baltagi (2013), pp. 204-205
data("Produc", package = "plm")
pProduc <- pdata.frame(Produc, index = c("state", "year", "region"))
form <- log(gsp) ~ log(pc) + log(emp) + log(hwy) + log(water) + log(util) + unemp
Baltagi_reg_204_5 <- plm(form, data = pProduc, model = "random", effect = "nested")
pProduc %>% mutate(reg.re = rownames(pProduc) %in% names(Baltagi_reg_204_5$residuals)) %>%
as_tibble() %>% select(state, year, region, reg.re)
#> # A tibble: 816 x 4
#> state year region reg.re
#> <fct> <fct> <fct> <lgl>
#> 1 CONNECTICUT 1970 1 T
#> 2 CONNECTICUT 1971 1 T
#> 3 CONNECTICUT 1972 1 T
#> 4 CONNECTICUT 1973 1 T
#> 5 CONNECTICUT 1974 1 T
#> 6 CONNECTICUT 1975 1 T
#> 7 CONNECTICUT 1976 1 T
#> 8 CONNECTICUT 1977 1 T
#> 9 CONNECTICUT 1978 1 T
#> 10 CONNECTICUT 1979 1 T
#> # ... with 806 more rows
最后,如果您运行第一个没有索引属性的Baltagi,即帮助文件中未修改的示例,代码应该是,
Grunfeld %>% rowid_to_column %>%
mutate(plm.reg = rowid %in% names(p$residuals)) %>% as_tibble()