在R中绘制正态分布/高斯导数

时间:2019-01-16 10:31:27

标签: r gaussian differentiation

我试图计算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)

这将产生以下情节:

enter image description here

但是,假设我想做的只是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)

产生此图:

differ

因此您可以看到它正在采用标准法线的导数,而不是N(2,2)。如果您打印出first_deriv和different_first_deriv的功能,即使它们旨在区分不同的功能,它们也是相等的。

有人知道如何解决此问题,所以我采用了我想要的指定高斯分布的导数吗?

2 个答案:

答案 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_parameterizationsGeneral normal distribution部分,那么它是标准法线的重新参数化。

我认为问题在于参数meansd没有出现在公式中,并且由于某些原因,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)

enter image description here