我正在尝试预测特定疾病的存活率。我唯一掌握的信息是诊断后1年,3年,5年和10年的生存率。
例如:
S,即生存率
S<-c(81,78,72,65)
x,诊断后的时间
x<-c(1,3,5,10)
我正在尝试测试一些功能,这些功能可以让我估算20年后的生存率。
我的一个功能定义为
f(x)= exp(ax ^ b),a和b未知,但需要为正。我已经使用了fmarm提供的代码,但是已经使用了另一个功能进行了测试。
f(x)=(1 +(x / a)^ b)^-1
但是,我得到了非常奇怪的值,所有的值都小于1,我似乎无法弄清楚为什么。我错过了什么吗?
S<-c(81,78,72,65)
x<-c(1,3,5,10)
f<-function(ab)
{
a <- ab[1]
b <- ab[2]
return(sum((((1+(x/a)**b)**-1)-S)**2))
}
minim <- nlm(f,p=c(1,1))
ab <- minim$estimate
a_opt <- ab[1]
b_opt <- ab[2]
prediction_exp <- function(x){
return((1+(x/a_opt)**b_opt)**-1)
}
prediction_exp(20)
plot(prediction_exp(1:20), type="l", col="blue", xlab="Nb d'années après diagnostic", ylab="survie nette en %")
lines(x,S,col="black")
P.S:我发现了我的错误。 S向量必须小于1,并且该函数假定为x * a,而不是(x / a)。再次感谢fmarm帮助我!
答案 0 :(得分:2)
在您的情况下,S和x是固定的,并且您想要找到最小化sum(i = 1至4)exp(a * x [i] ** b)-S [i])**的a和b 2
您可以创建一个函数
f <- function(ab){
a <- ab[1]
b <- ab[2]
return(sum((exp(a*x**b)-S)**2))
}
ab是长度为2的向量,其中第一位为a,第二位为b
要最小化此功能,可以使用nlm
minim <- nlm(f,p=c(0,0))
您必须给p:ab的起始参数。因为我不知道有什么好办法,所以我把a = 0和b = 0 结果有一个估计部分,可为您提供算法找到的最佳参数
ab <- minim$estimate
然后您可以从ab中提取a和b
a_opt <- ab[1]
b_opt <- ab[2]
您可以创建预测功能
prediction_exp <- function(x){
return(exp(a_opt*x**b_opt))
}
prediction_exp(20)
20年后预测的存活率约为63%
答案 1 :(得分:1)
这只是接受的答案中提供的代码,具有适当的生存结果(限于区间[0-1],并且更正了结果:
S<-c(81,78,72,65)/100
x<-c(1,3,5,10)
f<-function(ab)
{
a <- ab[1]
b <- ab[2]
return(sum((((1+(x*a)**b)**-1)-S)**2))
}
minim <- nlm(f,p=c(1,1))
ab <- minim$estimate
a_opt <- ab[1]
b_opt <- ab[2]
prediction_exp <- function(x){
return((1+(x*a_opt)**b_opt)**-1)
}
prediction_exp(20)
[1] 0.5975635
png(); plot(prediction_exp(1:20), type="l", col="blue", xlab="Nb d'années après diagnostic", ylab="survie nette en %")
lines(x,S,col="black") ; dev.off()