使用模型对象,例如panelmodel,标记使用的数据

use model object, e.g. panelmodel, to flag data used

是否有可能以某种方式使用 拟合对象 ,特别是我从 plm() 模型中获得的回归对象,以在所用数据中标记观察结果对于回归,如果它们实际上用于回归。我意识到这可以通过在我的原始数据中寻找完整的观察来完成,但我很好奇是否有一种方法可以使用 fit/reg 对象来标记数据。

让我用一个最小的工作示例来说明我的问题,

首先需要一些包,

# install.packages(c("stargazer", "plm", "tidyverse"), dependencies = TRUE)
library(plm); library(stargazer); library(tidyverse)

第二个数据,这个例子大量借鉴了 Baltagi (2013),table 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

数据准备的最后一步是使用

创建一个具有描述其个体和时间维度的索引属性的数据框
dta.p <- dta %>% group_by(firm, year)

现在回归

plm.reg <- plm(inv ~ value + capital, data = dta.p, model = "pooling")

结果,使用

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 中创建一个标志,如果这个观察被 used/not 使用,即我在上面创建的半随机缺失值。也许一些 喜欢的工具。

我想像,

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

更新,我尝试使用 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

向量是plm.reg$residuals。不确定 broom 好的解决方案,但这似乎有效:

library(tidyverse)

dta.p %>% 
as.data.frame %>% 
rowid_to_column %>% 
mutate(plm.reg = rowid %in% names(plm.reg$residuals))

对于使用class pdata.frame()创建一个描述其个体和时间维度的索引属性的人,您可以使用以下代码,这是来自[=16中的另一个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()