如何以编程方式设置R公式
我试图使用R包“ipw”来进行逆概率加权。我有一些列被命名为“covar.1”、“covar.2”、“covar.3”。。。所以我想给他们一个公式。从a开始,我让它与如何以编程方式设置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,
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)