当我映射包含 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() 遍历Y1Y2Y3 的每个值,然后提取estimatestd.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 告诉我向量不是向量的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试反序列化对象列表时,杰克逊抛出错误映射异常

将viewModel对象映射到ICollection实体

使用命令行将硬盘映像文件映射到分区[关闭]

基于 Haskell 中的字符串映射证明打印函数的穷举性

使用 Elasticsearch 进行映射

如何将 URL 与 PHP 项目的目录结构映射 [重复]