R

时间:2019-03-27 16:24:22

标签: r optimization sum

我正在尝试预测特定疾病的存活率。我唯一掌握的信息是诊断后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帮助我!

2 个答案:

答案 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()

enter image description here