Построение производных нормального распределения / гауссианы в R - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь вычислить производные гауссиана в 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 голосов
/ 16 января 2019

Это работает, если вы используете другую формулу, например попробуйте это:

different_norm <- function(x, mean=2, sd=2) dnorm((x-mean)/sd, 0, 1)/sd

Если вы видите секцию General normal distribution в https://en.wikipedia.org/wiki/Normal_distribution#Alternative_parameterizations, то это повторная параметризация стандартной нормали.

Я предполагаю, что проблема в том, что параметры mean и sd не появляются в формуле, а дополнительные аргументы из dnorm по какой-то причине не передаются

0 голосов
/ 16 января 2019

Вы можете просто рассчитать производные и записать их самостоятельно

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

...