我正在尝试解决方程并从中找到x
的值。我正在使用以下代码:
mu1 = 0
mu2 = 1
sigma1 = 0.5
sigma2 = 0.6
prior1 = 0.3
prior2 = 0.7
boundary = function(x) {
return(( 1 / sqrt(2 * pi * sigma1)) * exp(-0.5 * ((x - mu1) / sigma1)^2)*prior1) -
((1 / sqrt(2 * pi * sigma2)) * exp(-0.5 * ((x - mu2) / sigma2)^2)*prior2)
}
uniroot(boundary, c(-1e+05, 1e+07))
这不能给我正确的答案。我对R很新,我不确定uniroot
到底是怎么运作的。
solve()
函数)?答案 0 :(得分:2)
您可以使用内置的dnorm()
功能缩短代码(并尽量减少拼写错误的可能性):
curve(dnorm(x,mean=0,sd=0.5),from=-4,to=4)
curve(dnorm(x,mean=0,sd=0.6),add=TRUE,col=2)
如果我在合理的范围内尝试uniroot()
,我会得到合理的答案:
uniroot(function(x) dnorm(x,0,0.5)-dnorm(x,0,0.6), c(0,5)) ## 0.546
uniroot(function(x) dnorm(x,0,0.5)-dnorm(x,0,0.6), c(-5,0)) ## -0.546
如果我尝试从巨大的值开始,计算将会下溢(无论是手动还是使用dnorm()
;高斯低于R的最小可表示的有价值(见?.Machine
) 19和20。
dnorm(19,0,0.5) ## 2e-314
dnorm(20,0,0.5) ## 0
在某些情况下,你可以使用log=TRUE
中的dnorm()
来计算对数概率,而不是在计算中使用它,但是在这里(如许多贝叶斯计算中)你有点卡住,因为你必须减去结果。