Если вы 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