我试图计算R中的高斯导数,当我尝试指定均值和标准差时,R似乎忽略了这一点。例如,以下代码可绘制N(0,1)密度,它是一阶和二阶导数。
st_norm <- function(x) dnorm(x,0,1)
first_deriv <- function(x) {}
second_deriv <- function(x) {}
body(first_deriv) <- D(body(st_norm), 'x')
body(second_deriv) <- D(body(first_deriv), 'x')
curve(st_norm, -4, 4, ylim = c(-0.4, 0.4), col = 'blue')
curve(first_deriv, -4, 4, add = T, col = 'red')
curve(second_deriv, -4, 4, add = T, col = 'green')
abline(v=0, h=0)
这将产生以下情节:
但是,假设我想做的只是N(2,2),那么我将代码相应地更改为:
different_norm <- function(x) dnorm(x,2,2)
different_first_deriv <- function(x) {}
different_second_deriv <- function(x) {}
body(different_first_deriv) <- D(body(different_norm), 'x')
body(different_second_deriv) <- D(body(different_first_deriv), 'x')
curve(different_norm, -4, 8, ylim = c(-0.4, 0.4), col = 'blue')
curve(different_first_deriv, -4, 8, add = T, col = 'red')
curve(different_second_deriv, -4, 8, add = T, col = 'green')
abline(v=0, h=0)
产生此图:
因此您可以看到它正在采用标准法线的导数,而不是N(2,2)。如果您打印出first_deriv和different_first_deriv的功能,即使它们旨在区分不同的功能,它们也是相等的。
有人知道如何解决此问题,所以我采用了我想要的指定高斯分布的导数吗?
答案 0 :(得分:1)
如果您使用其他公式,例如试试这个:
different_norm <- function(x, mean=2, sd=2) dnorm((x-mean)/sd, 0, 1)/sd
如果您看到https://en.wikipedia.org/wiki/Normal_distribution#Alternative_parameterizations的General normal distribution
部分,那么它是标准法线的重新参数化。
我认为问题在于参数mean
和sd
没有出现在公式中,并且由于某些原因,dnorm
中的其他args也没有传递下来
答案 1 :(得分:0)
您可以计算出导数并自己写出
dnorm_deriv1 <- function(x, mean = 0, sd = 1) {
return(-((x-mean)/(sd^2))*dnorm(x, mean, sd))
}
dnorm_deriv2 <- function(x, mean = 0, sd = 1) {
return((((x-mean)^2) / (sd^4))*dnorm(x, mean, sd)
- (1/sd^2)*dnorm(x, mean, sd))
}
curve(dnorm, -4, 4, ylim = c(-0.4, 0.4), col = 'blue')
curve(dnorm_deriv1, -4, 4, add = T, col = 'red')
curve(dnorm_deriv2, -4, 4, add = T, col = ' green')
abline(v=0, h=0)
curve(dnorm(x, 2, 2), -4, 8, ylim = c(-0.1, 0.2), col = 'blue')
curve(dnorm_deriv1(x, 2, 2), -4, 8, add = T, col = 'red')
curve(dnorm_deriv2(x, 2, 2), -4, 8, add = T, col = ' green')
abline(v=2, h=0)