>

역 확률 가중치를 위해 R 패키지 "ipw"를 사용하려고합니다. 이름이 "covar.1", "covar.2", "covar.3"인 열이 있으므로 수식을 갖고 싶습니다. 이전 질문 에서 그것은 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
)

as.formula 와 함께 , 그것은 object 'groupf1' not found 에 대해 불평 . 왜 그런 연결을하고 있는지 확실하지 않습니다. 기본적으로 변수를 사용하여 f1을 동적으로 설정하는 방법이 필요합니다.

트레이스 백에서 소스 코드를 볼 수 있습니다

glm(formula = eval(
  parse(
    text = paste(
      deparse(tempcall$exposure, width.cutoff = 500), 
      deparse(tempcall$denominator, width.cutoff = 500), sep = ""))), 
  family = lf, data = data, na.action = na.fail, ...)

R 마스터 도움이 필요했습니다. 이 분모는 어떤 형식을 원합니까?


  • 답변 # 1

    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)
    
    

    여기서 f1   f.build 가 만든 공식입니다. . 이 방법으로 첫 번째 인수에서 여러 처리 변수를 순환 할 수 있습니다. 두 번째 인수는 공변량의 이름으로 구성된 벡터이거나 공변량 자체의 data.frame 일 수 있습니다. 와이즈 비즈   w.out 입니다   weightit 에 의해 추정 된 가중치를 포함하는 객체 . 기본값은 로지스틱 회귀이지만 변경할 수 있습니다. (나는 진정한 치료 성향이 weightit() 에서 요청할 수있는 프로 빗 모델을 사용하여 생성되었음을 알았습니다.   weightit 와 함께 .)

    첫 번째와 99 번째 백분위 수에서 가중치를 자르고 싶었던 것 같습니다.  그렇습니다. 기본적으로 가장 높은 가중치 만 다듬기 때문에 link = "probit" 를 설정했습니다.  또한 더 낮은 무게를 다듬습니다. 일반적으로 트림되지 않은 가중치가 충분한 경우 트리밍하기 전에 공변량 균형과 가중치의 변동성을 확인해야합니다. 와이즈 비즈  균형을 평가하도록 설계되었으며 trim 와 호환됩니다 . 아래는 lower = TRUE 에서 균형을 평가하는 방법입니다  개체 :

    cobalt
    
    

    잘린 무게와 트림되지 않은 무게도 비교할 수 있습니다 :

    WeightIt
    
    

    치료 효과를 예측할 준비가되면 weightit 에서 무게를 추출하면됩니다.  목적. 나는 bal.tab(w.out, un = TRUE) 를 사용  PS 가중치를 적용해야하는 강력한 표준 오류를 얻는 패키지 :

    bal.tab(f1, data = df, un = TRUE, 
             weights = list(untrimmed = w.out$weights,
                             trimmed = w.out2$weights))
    
    

    weightit 에 관한 많은 문서가 있습니다  그리고 jtools . 도움이 되셨기를 바랍니다.

    w1 <- w.out$weights jtools::summ(lm(metric ~ group, data = df, weights = w1), robust = TRUE, confint = TRUE)

  • 이전 Azure SQL Data Warehouse의 팩트 테이블 디자인
  • 다음 java - textarea 컨트롤 - 사용할 데이터 구조 및 라인별로 얻는 방법