Использовать строку в качестве формулы для функции ipwtm?

#r #string #formula

#r #строка #формула

Вопрос:

У меня есть вопросы, относящиеся к функции ipwtm. У меня есть длинный числитель и знаменатель, и я хотел бы присвоить им строки. Тем не менее, я пробовал разные методы, такие как использование get , eval , parse и as.formula , но функция не работает. Пожалуйста, дайте мне знать, если есть способ решить эту проблему.

Пример:

 library("ipw")
data("haartdat")
haartdat[1:10,]

numerator <- as.formula("~ sex   age")
denominator <- as.formula("~ cd4.sqrt   sex   age")

temp <- ipwtm(exposure = haartind, family = "survival",
        numerator = numerator, denominator = denominator,
        id = patient, tstart = tstart, timevar = fuptime, type = "first",
        data = haartdat)
 

Комментарии:

1. Разработчик использовал ‘tempcall <- match.call()’, за которым следует deparse(tempcall$числитель). Это преобразует все, что передается в параметре числителя, в строку. Если мы передаем объект формулы ‘numerator’, он не принимает значение внутри объекта numerator.

2. Тогда есть ли какой-либо способ, которым я могу установить числитель в виде строки numerator <- "~ sex age" и заставить функцию работать (например, что-то вроде temp <- ipwtm(..., numerator = eval(numerator), denominator = eval(denominator), id = patient...) ?

Ответ №1:

Как упоминалось в комментариях @jvargh7, это из-за match.call deparse , который возвращает значение как «числитель», «знаменатель». Можно добавить две строки в исходный код после match.call() и вызвать его как новую функцию.

 ipwtm2 <- function (exposure, family, link, numerator = NULL, denominator, 
id, tstart, timevar, type, data, corstr = "ar1", trunc = NULL, 
...) {


  tempcall <- match.call()
  tempcall$numerator <- numerator # new
   tempcall$denominator <- denominator # new
  ... 
  ...
  }
 

-тестирование

 library(survival)
library(ipw)

data(haartdat)

numerator <- as.formula("~ sex   age")
denominator <- as.formula("~ sex   age   cd4.sqrt")




temp <- ipwtm2(exposure = haartind, family = "survival",
        numerator = numerator, denominator = denominator,
        id = patient, tstart = tstart, timevar = fuptime, type = "first",
        data = haartdat)
        
        
temp_old <- ipwtm(exposure = haartind, family = "survival",
        numerator =  ~ sex   age, denominator = ~ sex   age   cd4.sqrt,
        id = patient, tstart = tstart, timevar = fuptime, type = "first",
        data = haartdat)
 

-проверьте вывод

 temp$num.mod
Call:
coxph(formula = Surv(tstart, fuptime, haartind) ~ sex   age, 
    data = haartdat, subset = tempdat$selvar == 1, na.action = na.fail, 
    method = "efron")

        coef exp(coef) se(coef)     z     p
sex 0.069424  1.071891 0.124365 0.558 0.577
age 0.007521  1.007549 0.005123 1.468 0.142

Likelihood ratio test=2.22  on 2 df, p=0.3287
n= 14389, number of events= 376 

temp_old$num.mod
Call:
coxph(formula = Surv(tstart, fuptime, haartind) ~ sex   age, 
    data = haartdat, subset = tempdat$selvar == 1, na.action = na.fail, 
    method = "efron")

        coef exp(coef) se(coef)     z     p
sex 0.069424  1.071891 0.124365 0.558 0.577
age 0.007521  1.007549 0.005123 1.468 0.142

Likelihood ratio test=2.22  on 2 df, p=0.3287
n= 14389, number of events= 376