当我映射包含 grf::causal_forest() 的函数时,R 告诉我向量不是向量
Posted
技术标签:
【中文标题】当我映射包含 grf::causal_forest() 的函数时,R 告诉我向量不是向量【英文标题】:R telling me vectors are not vectors when I map function that includes grf::causal_forest() 【发布时间】:2021-12-28 08:13:54 【问题描述】:我想将一个列名向量传递给purrr::map()
,并迭代地将它们传递给grf::causal_forest()
函数。在尝试此操作时,我得到一个错误,即我传递给 causal_forest()
的值不是向量(这是必需的),即使它们确实是。
例如,假设我有这个 df
n <- 500
p <- 5
X <- matrix(rnorm(n * p), n, p)
W <- rbinom(n, 1, 0.5)
Y1 <- pmax(X[, 1], 0) * W + X[, 2] + pmin(X[, 3], 0) + rnorm(n)
Y2 <- pmax(X[, 1], 0) * W + X[, 2] + pmin(X[, 3], 0) + rnorm(n)
Y3 <- pmax(X[, 1], 0) * W + X[, 2] + pmin(X[, 3], 0) + rnorm(n)
df <- data.frame(Y1, Y2, Y3, W, X)
head(df)
Y1 Y2 Y3 W X1 X2 X3 X4 X5
1 0.5457143 1.933581483 2.38474639 1 -0.788463384 0.9146194 0.73684926 -0.51268651 -0.53317046
2 0.9640213 -1.098133573 1.15639726 1 0.008873619 1.1513535 -1.09108874 0.10308198 1.46560149
3 0.8839862 0.005357524 1.26430215 1 1.588380125 -0.9261196 0.35219255 0.81017210 -1.86847771
4 0.1424579 -0.783984941 -0.01038922 0 2.391068797 0.3080699 -0.94651780 1.92707015 0.42646239
5 0.1771250 0.484711614 -1.95481918 1 0.058835623 0.2541232 -0.05696465 0.01781394 -0.07254417
6 -1.8144585 -1.972902090 -1.47101855 1 -0.518724916 -1.1474859 0.94850272 0.80635703 0.72156403
其中Y*
是因变量,X*
是协变量矩阵,W
是二元处理指标。我可以用 Y*
的单个值来估计模型,就像这样
library(grf)
c_forest <- causal_forest(
X = X,
Y = df$Y1,
W = df$W)
ate_c_forest <- average_treatment_effect(
c_forest,
target.sample = "overlap")
ate_c_forest
estimate std.err
0.12262543 0.09578717
但我想使用map()
遍历Y1
、Y2
和Y3
的每个值,然后提取estimate
和std.err
以获得对average_treatment_effect()
的每次调用的输出,并将这些放在一个小标题中。所以我写了这个小函数
Y_n <- c("Y1", "Y2", "Y3")
names(Y_n) <- Y_n
grf_fcn <- function(.x)
Y <- df$.x
W <- df$W
c_forest <- causal_forest(
X = X,
W = W,
Y = Y)
ate_c_forest <- average_treatment_effect(
c_forest,
target.sample = "overlap")
## call function
library(purrr)
grf_results <- purrr::map(
.x = tidyselect::all_of(Y_n),
.f = grf_fcn)
但是,当我尝试调用该函数时,它返回错误“Error in validate_observations(Y, X) : Observations (W, Y, Z or D) must be vectors.
”我觉得这很奇怪,因为Y*
和W
是 向量。例如
> is.vector(df$Y1)
[1] TRUE
> is.vector(df$W)
[1] TRUE
谁能看到我在哪里出错了?或者这是某种错误?
【问题讨论】:
【参考方案1】:为了更好地了解函数的问题所在,请将以下两个调用的输出与map
进行比较。
这是你正在使用的那个,它会返回NULL
:
purrr::map(tidyselect::all_of(Y_n), function(x) df$x )
这个使用括号表示法,它将返回预期值:
purrr::map(tidyselect::all_of(Y_n), function(x) df[[x]] )
这是map
的一个怪癖,老实说,我不太清楚幕后发生了什么,但至少我们知道如何修改你的函数以获得你想要的结果:
grf_fcn <- function(x)
Y <- df[[x]]
W <- df$W
c_forest <- causal_forest(
X = X,
W = W,
Y = Y)
ate_c_forest <- average_treatment_effect(
c_forest,
target.sample = "overlap")
【讨论】:
这真的很有帮助。谢谢胡安。我可以通过两个示例函数了解您的意思!很想知道幕后发生了什么,但实际的解决方法是最重要的:)以上是关于当我映射包含 grf::causal_forest() 的函数时,R 告诉我向量不是向量的主要内容,如果未能解决你的问题,请参考以下文章