0

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

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

1 回答 1

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()创建描述其个体和时间维度的索引属性的人,您可以使用以下代码,这是来自另一个 Baltagi 中的?plm

# == 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()
于 2018-02-19T21:50:37.583 回答