使用模型对象,例如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
数据准备的最后一步是使用 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
中创建一个标志,如果这个观察被 used/not 使用,即我在上面创建的半随机缺失值。也许一些 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
向量是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()
是否有可能以某种方式使用 拟合对象 ,特别是我从 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
数据准备的最后一步是使用 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
中创建一个标志,如果这个观察被 used/not 使用,即我在上面创建的半随机缺失值。也许一些 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
向量是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()