Получить матрицу модели из выходных данных регрессии - PullRequest
0 голосов
/ 01 августа 2020

Я хотел бы получить очищенные входные ковариаты и переменную результата после запуска нескольких регрессионных моделей из выходных данных модели - я хотел бы получить доступ к данным, поскольку они используются в фактической оценке. Для функции felm () lm () и lfe можно получить доступ как к выходной переменной, так и к ковариатам с указанием c "модели" выходных данных:

library(estimatr)
library(lfe)

set.seed(1)
N <- 100
X <- abs(rnorm(N))
y <- 1 + 2*X + rnorm(N)
data <- data.frame(y = y, X = X)
data[1, ] <- NA
head(data)
#         y         X
#1       NA        NA
#2 1.409403 0.1836433
#3 1.760336 0.8356286
#4 4.348590 1.5952808
#5 1.004431 0.3295078
#6 4.408224 0.8204684

lm_fit <- lm(y ~ log(X), data = data)
lm_robust_fit <- lm_robust(y ~ log(X), data = data)
felm_fit <- felm(y ~ log(X), data = data)

head(lm_fit$model)
#         y     log(X)
#2 1.409403 -1.6947599
#3 1.760336 -0.1795710
#4 4.348590  0.4670498
#5 1.004431 -1.1101553
#6 4.408224 -0.1978799
#7 2.691566 -0.7186105

head(eval(felm_fit$model))
#         y     log(X)
#2 1.409403 -1.6947599
#3 1.760336 -0.1795710
#4 4.348590  0.4670498
#5 1.004431 -1.1101553
#6 4.408224 -0.1978799
#7 2.691566 -0.7186105

Функция lm_robust из пакета оценки не имеет " модель "-объект как выход. Один из способов получить входные данные модели - использовать функцию expand.model.frame:

tmp <- expand.model.frame(lm_robust_fit, 
                  extras = ~ 1, 
                  na.expand = TRUE, 
                  envir = globalenv())
head(tmp)
#         y     log(X)
#2 1.409403 -1.6947599
#3 1.760336 -0.1795710
#4 4.348590  0.4670498
#5 1.004431 -1.1101553
#6 4.408224 -0.1978799
#7 2.691566 -0.7186105

А есть ли другой способ достичь этой цели?

1 Ответ

2 голосов
/ 01 августа 2020

Если вы unclass объект lm_robust_fit, вы увидите, что он просто не сохраняет значения из своего фрейма модели, поэтому вы не можете извлечь их непосредственно из объекта.

Однако, felm_fit также не содержит их - как вы показываете, вместо этого он предоставляет вызов model.frame, необходимый для его создания, который вам просто нужно eval.

Если вы посмотрите на код для lm, он фактически производит свои данные model точно таким же образом, за исключением того, что он требует дополнительного шага запуска eval в вызове model.frame.

Вы можете сделать точно так же, как lm и felm_fit делает, вызывая model.frame напрямую, который по умолчанию использует аргумент data, переданный исходному вызову, и оценивает его в правильной среде. Это похоже, но безопаснее, чем решение, которое вы придумали, потому что вам не нужно указывать, откуда поступают данные (т.е. вам не нужно беспокоиться о том, что объект находится внутри области, отличной от globalenv ).

Вызов model.frame напрямую также будет работать для всех трех различных типов моделей, поэтому, вероятно, вы упростили бы ваш код, используя эту единственную функцию для получения любого кадра модели независимо от типа.

Так вы можете сделать:

head(model.frame(lm_fit))
#>          y     log(X)
#> 2 1.409403 -1.6947599
#> 3 1.760336 -0.1795710
#> 4 4.348590  0.4670498
#> 5 1.004431 -1.1101553
#> 6 4.408224 -0.1978799
#> 7 2.691566 -0.7186105

head(model.frame(felm_fit))
#>          y     log(X)
#> 2 1.409403 -1.6947599
#> 3 1.760336 -0.1795710
#> 4 4.348590  0.4670498
#> 5 1.004431 -1.1101553
#> 6 4.408224 -0.1978799
#> 7 2.691566 -0.7186105

head(model.frame(lm_robust_fit))
#>          y     log(X)
#> 2 1.409403 -1.6947599
#> 3 1.760336 -0.1795710
#> 4 4.348590  0.4670498
#> 5 1.004431 -1.1101553
#> 6 4.408224 -0.1978799
#> 7 2.691566 -0.7186105
...