2017-01-12 35 views
0

我是R编程中的新手,我无法解决使用nls函数时发生的错误。 我尝试从ECDF拟合数据(值被提取并保存在y)与该功能模型具有四个参数:R nls发生了不同的错误

fitsim <- nls(y ~ exp(-(((a-Abfluss)/(c*(Abfluss-b)))^d)), 
      start = list(a=max(Abfluss), b=min(Abfluss), 
         c=3, d=1)) 

当我启动NLS功能发生这些错误:

Error in numericDeriv(form[[3L]], names(ind), env) : 
    Fehlender Wert oder etwas Unendliches durch das Modell erzeugt 

这意味着有一个缺失值,通过模型生成一些无穷大的值。 我的载体Abfluss和y有相同的长度。目标是获得参数估计。 也许问题是,该模型仅适用于此条件: c> 0,d> 0,b < = Abfluss < = a。 我尝试使用na.rm=True命令。然后出现另一个错误:

Error in model.frame.default(formula = ~y + Abfluss, na.rm = TRUE) : 
    Variablenlängen sind unterschiedlich (gefunden für '(na.rm)') 

这意味着,变量的长度是不同的。

我很感激每一种帮助和建议。

为了更好地理解我附上我的整个代码与整个数据:

time<-c(1851:2013) 
Abfluss<- c(4853,4214,5803,3430,4645,4485,3100,4797,4030,3590,5396,9864,3683,4485,4064,3420,5396, 
     4895,3931,4238,3790,3520,4263,5474,3790,4700,5109,4525,4007,6340,4993,6903,8160,3600,3480,3540, 
     3540,4565,3333,7764, 
     4755,7940,3112,3169,4435,5365,9422,3150,10500,4512,3790,4618,6126,3769,3704, 
     5938,5669,4552,5458,5854,4867,6057,4783,5753,5736,4618,6091,5820,5007,7984, 4435, 
     4645,7465,5820,5988,6022,4300,6062,3302,4877,4586,5275,4410,3174,4966,4939,4638, 
     5541,5760,6495,5435,4952,4912,6092,5182,5820,5129,6436,6648,3063,5550,5160,4400, 
     9600,6400,6380,6300,6180,6899,4360,5550,4580,3894,5277,7520,6780,5100,5430,4550, 
     6620,4050,4560,5290,6610,8560,4943,6940,4744,6650,5700,7440,6200,4597,3697,7300, 
     4644,5456,6302,3741,5398,9500,6296,5279,5923,6412,6559,6559,5891,5737,5010,5790, 
     10300,4150,4870,6740,7560,8010,5120,8170,7430, 7330,5900, 11150) 


#EV4-Distribution 
dEV4 <- function(x, a, b, c,d) { 
m<-exp(-(((a-Abfluss)/(c*(Abfluss-b)))^d)) 
return(m) 
} 

#Simulation example 
Sim<-dEV4(Abfluss,a=max(Abfluss),b=min(Abfluss), c=3, d=1) 
dEV4cdf<-cbind(Abfluss,Sim) 

#Empirical cdf 
p = ecdf(Abfluss) 
y<- p(Abfluss) #Extracting of cumulated probabilities 
m<-cbind(Abfluss,y) 

#plot EV4 and ecdf 
plot(dEV4cdf, type="p",main="EV4") 
plot(ecdf(Abfluss), add=T) 

#Fitting EV4 nls 
fitsim <- nls(y ~ exp(-(((a-Abfluss)/(c*(Abfluss-b)))^d)), 
      start = list(a=max(Abfluss), b=min(Abfluss), 
         c=3, d=1), na.rm=TRUE) 
+0

该参数被称为'na.action',并且需要一个诸如'na.omit'之类的函数,但您不需要它,因为您的数据中没有缺失值。该错误消息涉及在计算期间发生的非有限值。 – Roland

回答

2

不要使用开始是可行域的边界上,并尝试在nlmrt nlxb代替(可与被使用的值除了data =相同的参数是不可选):

library(nlmrt) 
fitsim <- nlxb(y ~ exp(-(((a - Abfluss)/(c * (Abfluss - b)))^d)), 
      data = data.frame(y, Abfluss), 
      start = list(a = 2 * max(Abfluss), b = min(Abfluss)/2, c = 3, d = 1)) 

plot(y ~ Abfluss, pch = 20) 
o <- order(Abfluss) 
fit <- y - fitsim$resid 
lines(fit[o] ~ Abfluss[o], col = "red") 

,并提供:

nlmrt class object: x 
residual sumsquares = 0.02908 on 163 observations 
    after 5001 Jacobian and 6060 function evaluations 
    name   coeff   SE  tstat  pval  gradient JSingval 
a    20047.7   NA   NA   NA 1.119e-07  3251 
b    -1175384   NA   NA   NA 1.432e-09  0.1775 
c    0.0129414   NA   NA   NA  -0.1296 5.808e-06 
d     12.146   NA   NA   NA -2.097e-06 6.798e-11 

screenshot

+0

非常感谢您的详细回复。 – Hark