从原始数据帧中捕获 felm 的残差并传递给 Python

capturing the residual from felm in original dataframe and passing to Python

我是 运行宁 R 通过 Python 使用 %load_ext rpy2.ipython.

#Prepare R in Python
%load_ext rpy2.ipython
%R install.packages("pacman")
%R pacman::p_load(pacman, tidyverse, lfe)

在 R 中,我 运行在数据帧上使用 felm 创建模型。我想捕获原始数据帧中的残差,然后将该数据帧传回 Python。我可以为常规 lm 执行此操作:

%%R -o test
dat <- mtcars
test <- mutate(res=residuals(lm(mpg~disp, data = dat)), dat)

然后在 Python 我有一个包含 res 的漂亮数据框:

test.describe()

不幸的是,当我使用 felm 而不是 lm 时,这种方法似乎不起作用:

%%R -o test2
dat <- mtcars
test2 <- mutate(res=residuals(felm(mpg~disp, data = dat)), dat)

我得到以下信息:“ValueError:数据必须是一维的”知道为什么这适用于 lm 而不适用于 felm 吗?我确实注意到当我 运行:

%%R
dat <- mtcars
test2 <- mutate(res=residuals(felm(mpg~disp, data = dat)), dat)
head(test2, 10)

残差计算正确并且似乎已添加到数据框中,但被命名为“mpg”而不是“res”。不确定这里发生了什么。感谢任何帮助。

问题是 lm residuals return 一个名为 vector,而 felm 是 returning一个 matrix 单列

str(residuals(felm(mpg~disp, data = dat)) )
 num [1:32, 1] -2.01 -2.01 -2.35 2.43 3.94 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr "mpg"

考虑通过使用 as.vector 转换为 vector 或使用 c

换行来移除维度
c(residuals(felm(mpg~disp, data = dat)))

如果是mutate,那就是

library(dplyr)
test <-  dat %>%
    mutate(res = c(residuals(felm(mpg~disp, data = .))))

-输出

> str(test)
'data.frame':   32 obs. of  12 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
 $ res : num  -2.01 -2.01 -2.35 2.43 3.94 ...

使用 OP 的方法,该列仍然是 matrix,这在 python

describe 方法中可能有问题
> test <-  dat %>%
+     mutate(res = residuals(felm(mpg~disp, data = .)))
> 
> str(test)
'data.frame':   32 obs. of  12 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
 $ res : num [1:32, 1] -2.01 -2.01 -2.35 2.43 3.94 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr "mpg"