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

时间:2018-02-19 20:36:43

标签: r plm broom

是否有可能以某种方式使用适合对象,特别是我从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

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

创建一个带有索引属性的数据框,该索引属性描述其个人和时间维度
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来标记一个标志,如果使用/不使用此观察结果,即半 - 我在上面创建的随机缺失值。也许有些喜欢工具。

我想象的是,

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

1 个答案:

答案 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()