Andrea Weidacher
2009-May-29 08:17 UTC
[R] final value of nnet with censored=TRUE for survival analysis
Hi there, I´ve a question concerning the nnet package in the area of survival analysis: what is the final value, which is computed to fit the model with the following nnet-c all: net <- nnet(cat~x, data=d, size=2, decay=0.1, censored=TRUE, maxit=20, Wts=rep(0,22), Hess=TRUE) where cat is a matrix with a row for each record and one column for each possible time-value and x another explanatory variable. Something like that: 0 6 17 20 28 37 [1,] 0 0 0 0 0 1 [2,] 1 0 0 0 0 0 [3,] 0 0 1 1 1 1 [4,] 0 1 0 0 0 0 ... where 0,6,17,... are the time values and record 1 has an event in time period 37 and record 3 is censored in time period 20. I tried to reproduce the final value with this term: tmp <- rowSums(cat*summary(net)$fitted.values) repFinalValue <- sum(-log(tmp)) but got the value 21.65438 instead of 21.71108. Is this only a rounding error or what´s wrong with my formula? My whole test example is printed below. Thanks, Andrea. # Some tests ... # ############################################################################### require(survival) require(nnet) # training data d <- matrix(nrow=20, ncol=3, dimnames=list(c(),c("time", "status", "x"))) d[,"time"] <- c(17,6,37,0,6,28,0,6,20,0,17,6,37,0,6,28,0,6,20,0) d[,"status"] <- rep(c(0,1),5,each=2) d[,"x"] <- c(0.27,0.27,0.49,0.49,0.61,0.70,0.78,0.78,0.84,0.86,0.27,0.27,0.49,0.49,0.61,0.70,0.78,0.78,0.84,0.86) # compute cat-variable cat <- computeCatVector(d, "time", "status") # => a matrix with one row for each row in d and a column for each distinct time value in d # generated values for each row in d: # if status = 1 => 1 in the time-Col, 0 otherwise # if status = 0 => 1 from the time-Col till the last column, 0 before # here: #0 6 17 20 28 37 #[1,] 0 0 0 0 0 1 #[2,] 1 0 0 0 0 0 #[3,] 0 0 1 1 1 1 #[4,] 0 1 0 0 0 0 #... # nnet for survival analysis net <- nnet(cat~x, data=d, size=2, decay=0.1, censored=TRUE, maxit=20, Wts=rep(0,22), Hess=TRUE) # reproduce the final value tmp <- rowSums(cat*summary(net)$fitted.values) repFinalValue <- sum(-log(tmp)) print(paste("Difference in finale value: mine vs. the nnet-final value:", repFinalValue, "vs.",summary(net)$value)) # the function to calculate the cat-matrix from time and status information of survival data computeCatVector <- function(d, timeCol, statusCol){ # init some values l <- length(unique(d[,timeCol])) n <- length(d[,statusCol]) cols <- as.character(sort(unique(d[,timeCol]))) cat <- matrix(rep(0,l*n), ncol=l, dimnames=list(c(),cols)) for (i in 1:n) { for (x in cols) { # DS mit Ereignis if(d[i,timeCol]==x & d[i,statusCol]==1){ cat[i,x] <- 1 } # DS mit Zensur if(as.numeric(as.character(d[i,timeCol]))<=as.numeric(x) & d[i,statusCol]==0){ cat[i,x] <- 1 } } } cat } [[alternative HTML version deleted]]
Prof Brian Ripley
2009-May-29 09:03 UTC
[R] final value of nnet with censored=TRUE for survival analysis
The value includes the weight decay term: it is a penalized fit. See the documentation pages 245 and 247. (nnet is support software for a book, so the book is the primary documentation.) On Fri, 29 May 2009, Andrea Weidacher wrote:> > Hi there, > > I?ve a question concerning the nnet package in the area of survival analysis: what is the final value, which is computed to fit the model with the following nnet-c > all: > > net <- nnet(cat~x, > data=d, > size=2, > decay=0.1, > censored=TRUE, > maxit=20, > Wts=rep(0,22), > Hess=TRUE) > > where cat is a matrix with a row for each record and one column for each possible time-value and x another explanatory variable. > Something like that: > > 0 6 17 20 28 37 > [1,] 0 0 0 0 0 1 > [2,] 1 0 0 0 0 0 > [3,] 0 0 1 1 1 1 > [4,] 0 1 0 0 0 0 > ... > > where 0,6,17,... are the time values and record 1 has an event in time period 37 and record 3 is censored in time period 20. > > > I tried to reproduce the final value with this term: > > tmp <- rowSums(cat*summary(net)$fitted.values) > repFinalValue <- sum(-log(tmp)) > > but got the value 21.65438 instead of 21.71108. Is this only a > rounding error or what?s wrong with my formula? > > My whole test example is printed below.[...] -- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595