如何在texreg调用中自定义拟合优度(gof)?

我有一些要显示的plm模型,但是我只能得到"Num. obs.", "Adj. R^2",, "R^2"(请参见下面的工作示例)。我想全部显示小nTF-statisticp-value,这些都是我在默认summary()调用中得到的。

我得到的一个例子。首先是一些数据和所需的软件包,

# install.packages(c("wooldridge", "plm", "texreg"), dependencies = TRUE)
library(wooldridge)
data(wagepan)
library(plm)


其次,一些型号

POLS <- plm(lwage ~ educ + black + hisp + exper+I(exper^2)+ married + union +
            factor(year), data = wagepan, index=c("nr","year") , model="pooling")

RE <- plm(lwage ~ educ + black + hisp + exper + I(exper^2) + married + union +
          factor(year), data = wagepan, index = c("nr","year") , model = "random")

FE <- plm(lwage ~ I(exper^2) + married + union + factor(year),
          data = wagepan, index = c("nr","year"), model="within")


第三,我当前的texreg调用及其输出,

# library(texreg)
texreg::screenreg(list(POLS, RE, FE), custom.coef.map = list('married' = 'Marrtied', 'union' = 'Union'))
#> ================================================
#>            Model 1      Model 2      Model 3
#> ------------------------------------------------
#> Marrtied      0.11 ***     0.06 ***     0.05 *
#>              (0.02)       (0.02)       (0.02)
#> Union         0.18 ***     0.11 ***     0.08 ***
#>              (0.02)       (0.02)       (0.02)
#> ------------------------------------------------
#> R^2           0.19         0.18         0.18
#> Adj. R^2      0.19         0.18         0.06
#> Num. obs.  4360         4360         4360
#> ================================================
#> *** p < 0.001, ** p < 0.01, * p < 0.05


我确实尝试添加, include.fstatistic = TRUE,但是似乎无法以这种方式获取它。因为我需要一些其他的自定义。

我的目标是这样的,

#> ------------------------------------------------
#> Obs.  (N)   4360         4360         4360
#> Indiv.(n)    545          545          545
#> Time  (T)      8            8            8
#> R^2           0.19         0.18         0.18
#> Adj. R^2      0.19         0.18         0.06
#> F-stat       72.458       68.4124      83.8515
#> P-value        (2.22e-16)   (2.22e-16)   (2.22e-16)
#> ================================================
#> *** p < 0.001, ** p < 0.01, * p < 0.05

最佳答案

您可以使用texreg::extract()对其进行破解。

为了获得“ small n”,我们首先需要一个小的函数。

getIndex <- function(fit){
  # extracts number of factor levels of index variables
  # from raw data used in models
  index.names <- as.character(as.list(summary(fit)$call)$index)[-1]
  if (length(index.names == 1)){
    df.name <- as.character(as.list(summary(fit)$call)$data)
    index.df <- get(df.name)[, index.names]
    length(unique(index.df))
  }
  if (length(index.names == 2)){
    df.name <- as.character(as.list(summary(fit)$call)$data)
    index.df <- get(df.name)[, index.names]
    cbind(length(unique(index.df[, 1])),
          length(unique(index.df[, 2])))
  } else {
    stop("no index variables specified in model")
  }

}


然后继续提取。

fv.1 <- summary(POLS)$fstatistic$statistic  # get F statistic
pv.1 <- summary(POLS)$fstatistic$p.value  # get p value
ns.1 <- getIndex(POLS)[1]  # get small n
tm.1 <- getIndex(POLS)[2]  # get times

library(texreg)
ex.1 <- extract(POLS)  # extract coefficients and GOF measures
[email protected] <- c([email protected][1:3],"Indiv.(n)", "Time (T)",
                    "F-stat", "P-value")  # the GOF names
ex.1@gof <- c(ex.1@gof[1:3], ns.1, tm.1, fv.1, pv.1)  # the GOF values
[email protected] <- c([email protected][1:3], FALSE, FALSE, TRUE, TRUE)  # numeric or integer

fv.2 <- summary(RE)$fstatistic$statistic
pv.2 <- summary(RE)$fstatistic$p.value
ns.2 <- getIndex(RE)[1]
tm.2 <- getIndex(RE)[2]

ex.2 <- extract(RE)
[email protected] <- c([email protected][1:3],"Indiv.(n)", "Time (T)",
                    "F-stat", "P-value")
ex.2@gof <- c(ex.2@gof[1:3], ns.2, tm.2, fv.2, pv.2)
[email protected] <- c([email protected][1:3], FALSE, FALSE, TRUE, TRUE)

fv.3 <- summary(FE)$fstatistic$statistic
pv.3 <- summary(FE)$fstatistic$p.value
ns.3 <- getIndex(FE)[1]
tm.3 <- getIndex(FE)[2]

ex.3 <- extract(FE)
[email protected] <- c([email protected][1:3],"Indiv.(n)", "Time (T)",
                    "F-stat", "P-value")
ex.3@gof <- c(ex.3@gof[1:3], ns.3, tm.3, fv.3, pv.3)
[email protected] <- c([email protected][1:3], FALSE, FALSE, TRUE, TRUE)


屈服

> screenreg(list(ex.1, ex.2, ex.3))

=======================================================
                  Model 1      Model 2      Model 3
-------------------------------------------------------
[TRUNCATED...]
-------------------------------------------------------
R^2                  0.19         0.18         0.18
Adj. R^2             0.19         0.18         0.06
Num. obs.         4360         4360         4360
Indiv.(n)          545          545          545
Time (T)             8            8            8
F-stat              72.46        68.41        83.85
P-value              0.00         0.00         0.00
=======================================================
*** p < 0.001, ** p < 0.01, * p < 0.05


看一下str(extract(FE))将此应用于其他GOF。

要将其包装为函数,请查看@Neal Fultz的答案中的代码。

08-24 12:17