2015-12-17 60 views
0

此的平方之和是,我想中的R的代码的功能,写一个程序,以尽量减少递归指数函数

enter image description here

i = 1,2,3,....j-1 

A,B,C,F,克将被从NLS确定(与起始值任意设定为7,30,15,1,2)

S且Y是在数据集中

功能可以在一个更大的计算量被呈现人友好的递推方程,

enter image description here

这里是我的代码的尝试,但我无法得到它的收敛,

S=c(235,90,1775,960,965,1110,370,485,667,140,588,10,0,1340,600,0,930,1250,930,120,895,825,0,935,695,270,0,610,0,0,445,0,0,370,470,819,717,0,0,60,0,135,690,0,825,730,1250,370,1010,261,0,865,570,1425,150,1515,1143,0,675,1465,375,0,690,290,0,430,735,510,270,450,1044,0,928,60,95,105,60,950,0,1640,3960,1510,500,1135,0,0,0,181,568,60,1575,247,0,1270,870,290,510,0,540,455,120,580,420,90,525,1116,499,0,60,150,660,1080,1715,90,1090,840,975,280,850,633,30,1530,1765,880,150,225,77,1380,810,835,0,540,1017,1108,0,300,600,90,370,910,0,60,60,0,0,0,0,50,0,735,900) 

Y=c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,7.7,NA,NA,7.2,NA,NA,NA,NA,NA,NA,7.4,NA,NA,NA,NA,NA,NA,10.7,NA,NA,NA,NA,8.1,8.5,NA,NA,NA,NA,NA,9.9,NA,7.4,NA,NA,NA,9.5,NA,NA,9,NA,NA,NA,8.8,NA,NA,8.5,NA,NA,NA,6.9,NA,NA,7.9,NA,NA,NA,7.3,NA,7.9,8.3,NA,NA,NA,11.5,NA,NA,12.3,NA,NA,NA,6.1,NA,NA,9,NA,NA,NA,10.3,NA,NA,9.7,NA,NA,8.6,NA,9.1,NA,NA,11,NA,NA,12.4,11.1,10.1,NA,NA,NA,NA,11.7,NA,NA,9,NA,NA,NA,10.2,NA,NA,11.2,NA,NA,NA,11.8,NA,9.2,10,9.8,NA,9.5,11.3,10.3,9.5,10.2,10.6,NA,10.8,10.7,11.1,NA,NA,NA,NA,NA,NA,NA,NA,12.6,NA) 

mydata = data.frame(Y,S) 

f <- function(a,b,f,c,g,m) { 

    model <- matrix(NA,nrow(m)+1,3) 

    model[1,1]=0 
    model[1,2]=0 
    model[1,3]=a 

    for (i in 2:nrow(model)){ 
     model[i,1]=exp(-1/c)*model[i-1,1] + m$S[i-1] 
     model[i,2]=exp(-1/g)*model[i-1,2] + m$S[i-1] 
     model[i,3]=a+b*model[i,1]-f*model[i,2] 
    } 
    model <- as.data.frame(model) 
    colnames(model) = c('l','m','Y') 
    model$Y[which(m$Y>0)] 
} 

Y=mydata$Y 
nls(Y ~ f(a,b,f,c,g,mydata), start=list(a=7,b=5.3651,f=5.3656,c=16.50329,g=16.5006),control=list(maxiter=1000,minFactor=1e-12)) 

的错误,我已经得到依赖于初始值:

错误NLS(Y〜F(A,b,F,C,G,MYDATA),开始=列表(= 7,:
迭代次数超过10最大00

错误NLS(Y〜F(A,B,F,C,G,MYDATA),开始=列表(= 7,:
奇异梯度

我卡和不知道该怎么做,任何帮助将不胜感激。

+0

a)您必须构造MYDATA为data.frame使用$:'MYDATA < - data.frame(Y,S)'。 b)什么是'p0'? c)你可以运行'f(7,5,16,16,mydata)'吗?你会得到正确的结果吗?如果不是,nls不会工作... –

+0

对不起,p0 = a,更正了更正。 f(7,5,16,16,mydata)有效,它会生成预测的Y – mct

回答

1

试试这个:

ff <- function(a,b,f,c,g) { 
    Y <- numeric(length(S)) 
    for(i in seq(from=2, to=length(S))) { 
     j <- seq(length=i-1) 
     Y[i] <- a + sum((b*exp(-(i-j)/c) - f*exp(-(i-j)/g))*S[j]) 
    } 
    Y 
} 

S <- c(235,90,1775,960,965,1110,370,485,667,140,588,10,0,1340,600,0,930,1250,930,120,895,825,0,935,695,270,0,610,0,0,445,0,0,370,470,819,717,0,0,60,0,135,690,0,825,730,1250,370,1010,261,0,865,570,1425,150,1515,1143,0,675,1465,375,0,690,290,0,430,735,510,270,450,1044,0,928,60,95,105,60,950,0,1640,3960,1510,500,1135,0,0,0,181,568,60,1575,247,0,1270,870,290,510,0,540,455,120,580,420,90,525,1116,499,0,60,150,660,1080,1715,90,1090,840,975,280,850,633,30,1530,1765,880,150,225,77,1380,810,835,0,540,1017,1108,0,300,600,90,370,910,0,60,60,0,0,0,0,50,0,735,900) 
Y <- c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,7.7,NA,NA,7.2,NA,NA,NA,NA,NA,NA,7.4,NA,NA,NA,NA,NA,NA,10.7,NA,NA,NA,NA,8.1,8.5,NA,NA,NA,NA,NA,9.9,NA,7.4,NA,NA,NA,9.5,NA,NA,9,NA,NA,NA,8.8,NA,NA,8.5,NA,NA,NA,6.9,NA,NA,7.9,NA,NA,NA,7.3,NA,7.9,8.3,NA,NA,NA,11.5,NA,NA,12.3,NA,NA,NA,6.1,NA,NA,9,NA,NA,NA,10.3,NA,NA,9.7,NA,NA,8.6,NA,9.1,NA,NA,11,NA,NA,12.4,11.1,10.1,NA,NA,NA,NA,11.7,NA,NA,9,NA,NA,NA,10.2,NA,NA,11.2,NA,NA,NA,11.8,NA,9.2,10,9.8,NA,9.5,11.3,10.3,9.5,10.2,10.6,NA,10.8,10.7,11.1,NA,NA,NA,NA,NA,NA,NA,NA,12.6,NA) 
nls(Y ~ f(a,b,f,c,g,mydata), start=list(a=7,b=5.3651,f=5.3656,c=16.50329,g=16.5006)) 

但我无法得到NLS跑这里来。你也可以尝试一个通用的优化器。构造函数平方的总和(平方-sum因为我们最大化):

SS <- function(par) { 
    a <- par[1] 
    b <- par[2] 
    f <- par[3] 
    c <- par[4] 
    g <- par[5] 
    -sum((Y - ff(a,b,f,c,g))^2, na.rm=TRUE) 
} 

最大化:

library(maxLik) 
summary(a <- maxBFGS(SS, start=start)) 

它的工作原理,但正如你看到的梯度还是蛮大的。我得到的梯度小,如果我在BFGS的输出值重新运行NR优化:

summary(b <- maxNR(SS, start=coef(a))) 

这给结果

​​

我不知道这是有道理的。 nls和其他优化器的问题表明,您有数值不稳定性,或者与大数值有关,或者与模型公式中的指数不同。

检查什么是对那里发生的:-)

+0

我输入命令“summary(a < - maxBFGS(SS,start = start)”时出错,不应该指定SS (?)?我也将起始值更改为f(10,10,5,10,20,mydata)并将其收敛。数字看起来比maxNR结果更正确,b&f和c&g数字不应该那么相似,它们应该是2-3倍的差异。此外,即使它现在与我的原始代码汇合,如果呈现不同的数据集,我将无法猜测正确的起始值。我如何确定正确的起始值?也许你的maxNR方法更适合这个原因。 – mct

+0

你得到的错误信息是什么?没有通用的好方法来获得良好的初始值 - 这首先就等于解决问题。你可以尝试一个强大的全球优化器,比如SANN,或者Nelder-Mead(健壮但不是全局的)。运行几百次,并将这些系数作为N-R或BFGS的起始值。如果你有数值问题,分析梯度也可能有很大的帮助。 –