我试图使用' relsurv'在R中打包以比较一个队列的生存与国家生命表。下面的代码显示了我使用relsurv中的示例但更改生命表数据的问题。我在下面的生命表数据中只使用了两年和两年,实际数据要大得多但却给出了同样的错误。错误是“无效的费率表”参数'但是我按照示例生活表' slopop'来格式化它。和' survexp.us'。
library(survival)
library(relsurv)
data(rdata) # example data from relsurv
raw = read.table(header=T, stringsAsFactors = F, sep=' ', text='
Year Age sex qx
1980 30 1 0.00189
1980 31 1 0.00188
1981 30 1 0.00191
1981 31 1 0.00191
1980 30 2 0.00077
1980 31 2 0.00078
1981 30 2 0.00076
1981 31 2 0.00074
')
ages = c(30,40) # in years
years = c(1980, 1990)
rtab = array(data=NA, dim=c(length(ages), 2, length(years))) # set up blank array: ages, sexes, years
for (y in unique(raw$Year)){
for (s in 1:2){
rtab[ , s, y-min(years)+1] = -1 * log(1-subset(raw, Year==y&sex==s)$qx) / 365.24 # probability of death in next year, transformed to hazard (see ratetables help)
}
}
attributes(rtab)$dimnames[[1]] = as.character(ages)
attributes(rtab)$dimnames[[2]] = c('male','female')
attributes(rtab)$dimnames[[3]] = as.character(years)
attributes(rtab)$dimid <- c("age", "sex", 'year')
attributes(rtab)$dim <- c(length(ages), 2, length(years))
attributes(rtab)$factor = c(0,0,1)
attributes(rtab)$type = c(2,1,4)
attributes(rtab)$cutpoints[[1]] = ages*365.24 # must be in days
attributes(rtab)$cutpoints[[2]] = NULL
attributes(rtab)$cutpoints[[3]] = as.date(paste("1Jan", years, sep='')) # must be date
attributes(rtab)$class = "ratetable"
# example from relsurv
rsmul(Surv(time,cens) ~ sex+as.factor(agegr)+
ratetable(age=age*365.24, sex=sex, year=year),
data=rdata, ratetable=rtab, int=1)
答案 0 :(得分:0)
尝试使用relsurv包中的transrate函数重新格式化数据。这应该会为您提供兼容的数据集。
此致 约什
答案 1 :(得分:0)
要添加三件事:
您应该设置attributes(rtab)$factor = c(0,1,0)
,因为性别(第二维度)是一个因素(即,不随时间变化)。
检查某些内容是否为有效费率表的好方法是使用is.ratetable()
功能。 is.ratetable(rtab, verbose = TRUE)
甚至会返回一条说明错误的消息。
检查is.ratetable
的结果,而不首先使用verbose
,因为它谎言有效的费率表。
本评论的其余部分是关于这个谎言。
如果未给出type
属性,is.ratetable
将使用factor
属性计算它;你可以通过打印功能看到这一点。但是,它似乎做错了。它使用type <- 1 * (fac == 1) + 2 * (fac == 0) + 4 * (fac > 0)
,其中fac
为attributes(rtab)$factor
。
但下一部分检查type
属性是否已提供,表示唯一有效值为1
,2
,3
和{{1} }。从上面的代码中获取4
是不可能的。
例如,让我们检查1
包提供的slopop
费率表。
relsurv
我认为这是您的费率表被挂起的地方。