Formula Error Internal Function

I want to use survfit(), and basehaz()within functions, but they do not work. Could you take a look at this problem. Thank you for your help. The following code produces an error:

library(survival)

n <- 50      # total sample size
nclust <- 5  # number of clusters
clusters <- rep(1:nclust,each=n/nclust)
beta0 <- c(1,2)
set.seed(13)
#generate phmm data set
Z <- cbind(Z1=sample(0:1,n,replace=TRUE),
       Z2=sample(0:1,n,replace=TRUE),
       Z3=sample(0:1,n,replace=TRUE))
b <- cbind(rep(rnorm(nclust),each=n/nclust),rep(rnorm(nclust),each=n/nclust))
Wb <- matrix(0,n,2)
for( j in 1:2) Wb[,j] <- Z[,j]*b[,j]
Wb <- apply(Wb,1,sum)
T <- -log(runif(n,0,1))*exp(-Z[,c('Z1','Z2')]%*%beta0-Wb)
C <- runif(n,0,1)
time <- ifelse(T<C,T,C)
event <- ifelse(T<=C,1,0)
mean(event)
phmmd <- data.frame(Z)
phmmd$cluster <- clusters
phmmd$time <- time
phmmd$event <- event

fmla <- as.formula("Surv(time, event) ~ Z1 + Z2")

BaseFun <- function(x){
start.coxph <- coxph(x, phmmd)  

print(start.coxph)

betahat <- start.coxph$coefficient
print(betahat) 
print(333)  
print(survfit(start.coxph))                                                                                                                                                                                                                                     
m <- basehaz(start.coxph)
print(m)
}  
BaseFun(fmla)
Error in formula.default(object, env = baseenv()) : invalid formula

But the following function works:

fit <- coxph(fmla, phmmd)    
basehaz(fit)
+4
source share
2 answers

This is a review issue. Please note that the environment basehaz:

environment(basehaz)
<environment: namespace:survival>

Meanwhile:

environment(BaseFun)
<environment: R_GlobalEnv>

Therefore, therefore, the basehaz function cannot find a local variable inside the function.

A possible solution is to send x from above using assign:

 BaseFun <- function(x){

    assign('x',x,pos=.GlobalEnv)

    start.coxph <- coxph(x, phmmd)  
    print(start.coxph)

    betahat <- start.coxph$coefficient
    print(betahat) 
    print(333)  
    print(survfit(start.coxph)) 

    m <- basehaz(start.coxph)
    print(m) 
    rm(x)

       }  
    BaseFun(fmla)

Other solutions may be more directly related to environments.

+5
source

@moli @aatrujillob. , , , - rpart partykit.

:

N <- 200
data <- data.frame(X = rnorm(N),W = rbinom(N,1,0.5))
data <-  within( data, expr = {
  trtprob <- 0.4 + 0.08*X + 0.2*W -0.05*X*W
  Trt <- rbinom(N, 1, trtprob)
  outprob <- 0.55 + 0.03*X -0.1*W - 0.3*Trt
  Outcome <- rbinom(N,1,outprob)
  rm(outprob, trtprob)
})

(train_data) train_data.

, , . , train_data .

my_formula <- Trt~W+X 
exists("train_data")
# [1] FALSE
exists("train_data", envir = environment(my_formula))
# [1] FALSE

, . ,

badFunc <- function(data, my_formula){
  train_data <- data[1:100,]
  ct_train <- rpart::rpart(
    data= train_data,
    formula = my_formula,
    method = "class")
  ct_party <- partykit::as.party(ct_train)
}

, OP.

library(rpart)
library(partykit)

bad_out <- badFunc(data=data, my_formula = my_formula)
# Error in is.data.frame(data) : object 'train_data' not found 
# 10.   is.data.frame(data) 
# 9.    model.frame.default(formula = Trt ~ W + X, data = train_data, 
#          na.action = function (x) {Terms <- attr(x, "terms") ... 
# 8.    stats::model.frame(formula = Trt ~ W + X, data = train_data, 
#          na.action = function (x) {Terms <- attr(x, "terms") ... 
# 7.    eval(expr, envir, enclos) 
# 6.    eval(mf, env) 
# 5.    model.frame.rpart(obj) 
# 4.    model.frame(obj) 
# 3.    as.party.rpart(ct_train) 
# 2.    partykit::as.party(ct_train) 
# 1.    badFunc(data = data, my_formula = my_formula) 

print(bad_out)
# Error in print(bad_out) : object 'bad_out' not found

, rpart() coxph(), model=TRUE . , .

goodFunc <- function(data, my_formula){
  train_data <- data[1:100,]
  ct_train <- rpart::rpart(
    data= train_data,
    ## This solved it for me
    model=TRUE,
    ## 
    formula = my_formula,
    method = "class")
  ct_party <- partykit::as.party(ct_train)
}
good_out <- goodFunc(data=data, my_formula = my_formula)
print(good_out)    
# Model formula:
# Trt ~ W + X
# 
# Fitted party:
# [1] root
# |   [2] X >= 1.59791: 0.143 (n = 7, err = 0.9)
##### etc

model rpart():

:

: ? (, rpart), , .

, environments , ( ). , model=TRUE !

+2

All Articles