如何以编程方式设置R公式

如何以编程方式设置R公式,r,formula,R,Formula,我试图使用R包“ipw”来进行逆概率加权。我有一些列被命名为“covar.1”、“covar.2”、“covar.3”。。。所以我想给他们一个公式。从a开始,我让它与glm,matchit和其他功能一起工作。但对于ipw,它不起作用。如果我手动复制并粘贴print(f1)在分母处输出的内容,它会起作用,因此我尝试不使用as.formula,但仍然不起作用。复制、运行 library(ipw) betaz <- c(0.75, -0.5, 0.25) betay <- c(0.5,

我试图使用R包“ipw”来进行逆概率加权。我有一些列被命名为“covar.1”、“covar.2”、“covar.3”。。。所以我想给他们一个公式。从a开始,我让它与
glm
matchit
和其他功能一起工作。但对于ipw,它不起作用。如果我手动复制并粘贴
print(f1)
在分母处输出的内容,它会起作用,因此我尝试不使用
as.formula
,但仍然不起作用。复制、运行

library(ipw)

betaz <- c(0.75, -0.5,  0.25)
betay <- c(0.5, 1.0, -1.5)

X <- matrix(rnorm(3 * 250), 250)
ps <- pnorm(X %*% betaz)
Z <- rbinom(250, 1, ps)
epsilon <- rnorm(250, 0.0, 0.5)

Y0 <- X %*% betay + epsilon
Y1 <- X %*% betay + 0.5 + epsilon
Y <- Y0 * (1 - Z) + Y1 * Z
df <- data.frame(id = seq(250), covar = X, group = Z, metric = Y)
print(df[1:10,])

cols <- colnames(df)
covars <- cols[grep("covar", colnames(df))]
f <- as.formula(paste('group','~', paste(covars, collapse="+")))
psmodel <- glm(f, family = binomial(), data=df)
pscore <- psmodel$fitted.values

f1 <- as.formula(paste('~', paste(covars, collapse="+")))
print(f1)
weightmodel <- ipwpoint(
  exposure = group, family = "binomial", link = "logit", 
  denominator = f1,
  data = df, trunc = .01
)

R需要主人的帮助。这个分母需要什么形式?

ipw
的编写方式使得动态输入公式非常困难。这是我不得不编写
WeightIt
包的动机之一,该包具有相同的功能(除了少数罕见的情况外)。此外,在我的
cobalt
包中,有一个函数
f.build()
,它根据输入创建一个公式

您可以将代码的最后几行替换为以下内容:

f1 <- f.build("group", covars)
w.out <- weightit(f1, data = df, estimand = "ATE")
w.out2 <- trim(w.out, .01, lower = TRUE)
您还可以比较修剪和未修剪的权重:

bal.tab(f1, data = df, un = TRUE, 
         weights = list(untrimmed = w.out$weights,
                         trimmed = w.out2$weights))
当您准备好评估治疗效果时,只需从
weightit
对象中提取权重即可。我使用
jtools
软件包来获得稳健的标准误差,这是PS加权所必须的:

w1 <- w.out$weights
jtools::summ(lm(metric ~ group, data = df, weights = w1),
             robust = TRUE, confint = TRUE)
w1
bal.tab(f1, data = df, un = TRUE, 
         weights = list(untrimmed = w.out$weights,
                         trimmed = w.out2$weights))
w1 <- w.out$weights
jtools::summ(lm(metric ~ group, data = df, weights = w1),
             robust = TRUE, confint = TRUE)