Göran, David,

in order to adapt aftreg to my needs I wrote a little function that I would like to share with you and the community.


WHAT DOES IT FIX?

(1) Using the id-argument in combination with missing values on covariates wasn't easily possible before because the id-dataframe and the data-dataframe had different sizes and aftreg quitted with an error. My fix makes sure that NAs are excluded from both dataframes and aftreg will run without error here.

(2) The id-argument was required to be specified by its "absolute path" (eg. id=testdata$groupvar, see below in this thread). My adapted funtion takes the name of the id-variable as a string, eg. id="groupvar".


HOW DOES IT WORK?

Use function aftreg2 just like you would use aftreg. Mandatory arguments are: formula, data and id, where id is a string variable. Example:

> testdata
  start stop censor groupvar      var1
1     0    1      0        1 0.1284928
2     1    2      0        1 0.4896125
3     2    3      0        1 0.7012899
4     3    4      0        1        NA
5     0    1      0        2 0.7964361
6     1    2      0        2 0.8466039
7     2    3      1        2 0.2234271

model1 <- aftreg(Surv(start, stop, censor)~var1, data=testdata, id=groupvar)
> ERROR.

model2 <- aftreg2(Surv(start, stop, censor)~var1, data=testdata, id="groupvar")
> WORKS FINE.


PREREQUISITES:

(1) Make sure that missing values are only present at the end of a lifetime. The regression will yield false results if you have missing covariate data in the middle of a lifetime. For instance: known covariates from liftetime 0-10, 13-20, but not from 11-12. (Göran: Please correct me if I'm wrong here!).

(2) If you have missing covariate data at the beginning of a lifetime (eg. missing from 0-5, but present from 6-censoring), this fix will yield false results if one _cannot_ assume that the missing covariates were the same from 0-5 as they were at 6. (Göran: Please correct me again if I'm wrong here with my interpretation, but that's basically what you said before)


LISTING:

aftreg2 <- function(formula, data, id, ...){
        
        call <- match.call()
        
non_na_cols <- attr(attr(terms(formula), "factors"), "dimnames")[2][[1]]
        
        data <- data[complete.cases(data[non_na_cols]),]
        data <- data[complete.cases(data[id]),]
                                
        cat("Original Call: ")
        print(call)
        
        return(aftreg(formula=formula, data=data, id=data[,id], ...))   
}


Hope someone finds this interesting.

All the best
Philipp


David Winsemius wrote:

On Feb 11, 2010, at 5:58 AM, Philipp Rappold wrote:

Göran, thanks!

One more thing that I found: As soon as you have at least one NA in the independent vars, the trick that you mentioned does not work anymore. Example:

> testdata
 start stop censor groupvar      var1
1     0    1      0        1 0.1284928
2     1    2      0        1 0.4896125
3     2    3      0        1 0.7012899
4     3    4      0        1        NA
5     0    1      0        2 0.7964361
6     1    2      0        2 0.8466039
7     2    3      1        2 0.2234271

> aftreg(Surv(start, stop, censor)~var1, data=testdata, id=testdata$groupvar) Error in order(id, Y[, 1]) : Different length of arguments (* I translated this from the German Output *)

Do you think there is a simple hack which excludes all subjects that have at least on NA in their independent vars? If it was only one dependent var it would probably be easy by just using subset, but I have lots of different combinations of vars that I'd like to test ;)


I don't know if it's a "hack", but there are a set of functions that perform such subsetting:

?na.omit

There is a parameter that would accomplish that goal inside aftreg. You may want to check what your defaults are for na.action.


______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to