从原始数据帧中捕获 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"
我是 运行宁 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"