使用purrr::map迭代调用grf::causal_forest时报观测值非向量错误
错误原因排查&解决方法
- 90%以上该场景报错的核心原因是迭代取列时返回了单列tibble而非向量:tidyverse中tibble用
df["列名"]的方式取单列时,返回的是1列的tibble结构,不会自动降维为向量,而grf::causal_forest要求Y、W输入必须是一维向量,把取列方式替换为df[["列名"]]或者dplyr::pull(df, 列名)即可解决。 - 次要原因是封装函数时没有正确对列名字符串/符号做求值:如果你传入的是未求值的列名符号而非字符串,需要先在函数内完成求值再传入
causal_forest。
可运行的参考实现
library(tidyverse) library(grf) # 模拟测试数据 n <- 2000 p <- 10 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 <- 2*X[,1] * W + X[,3] + rnorm(n) df <- as_tibble(X) %>% mutate(W = W, Y1 = Y1, Y2 = Y2) # 待迭代的Y列名向量 y_cols <- c("Y1", "Y2") # 迭代建模提取结果 result <- map_dfr(y_cols, function(y_name) { # 核心:取Y列要返回向量,用[[或者pull Y <- df[[y_name]] W <- df[["W"]] # 建模 cf <- causal_forest(X = X, Y = Y, W = W) # 提取ATE结果 ate_res <- average_treatment_effect(cf) tibble( y_col = y_name, estimate = unname(ate_res["estimate"]), std.err = unname(ate_res["std.err"]) ) })
你可以在自己的迭代代码中插入print(str(Y))调试,只要输出显示为tibble [N × 1]就可以确认是取列格式错误,按上述方法调整即可。
内容的提问来源于stack exchange,提问作者C.Robin
相关产品推荐
相关产品推荐

