R处理0/0和NaN的技巧

时间:2016-05-08 04:49:42

标签: r nan

我有两个高斯函数,我正在除以某些值,然后使用if-else语句和积分的结果值。由于两者都相当快地进入0,我最终得到0/0,其中R返回为NaN。这会在代码中产生错误。除了从Rmpfr那里获得更高的精确度之外,我想知道如何处理导致0/0或NaN的东西。

编辑:这是我正在使用的代码,以便更清晰

$npm install express --save

如果我跑:

parameters=c(1,1,2)
R<-function(params,z.){
    params[2]*exp(-z.^2/(2*params[3]^2))
}

alpha<-function(params,z.,v.){
    1/v.[2]*exp(-(z.-v.[1])^2/(2*v.[2]))
}

total.rel.alpha<-function(params,z.,u.){
    final=0
    species.number<-dim(u.)[1]
    if(is.null(dim(u.))){
        return(alpha(params,z.,u.)/R(params,z.))
    }
    for(i in 1:species.number){
        final=final+alpha(params,z.,u.[i,])
    }
    return(final/R(params,z.))
}

Kz<-function(params,z.,v.,u.){
    if(total.rel.alpha(params,z.,u.)>=0 & total.rel.alpha(params,z.,u.)<=1){
        alpha(params,z.,v.)
    }else if(total.rel.alpha(params,z.,u.)>1){
        alpha(params,z.,v.)/total.rel.alpha(params,z.,u.)
    }
}

K<-function(params,v.,u.){
    integrate(Kz,-Inf,Inf,params=params,v.=v.,u.=u.)$value
}

我得到了

K(parameters, c(1,1), c(1,1))

我认为这是因为在尾巴中我得到的总数是0/0.al.alpha

1 个答案:

答案 0 :(得分:2)

使用log(p1 / p2),其中p1和p2是所讨论的高斯密度。您将获得二次项加上其他一些东西的差异。

采用对数是处理非常小但非零概率值的标准方法。