【问题标题】:Plotting derivatives of normal distribution / Gaussians in R在R中绘制正态分布/高斯的导数
【发布时间】:2019-01-16 19:24:57
【问题描述】:

我正在尝试计算 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 的函数,它们是相等的,即使它们是为了区分不同的函数。

有谁知道如何解决这个问题,所以我正在对我想要的指定高斯分布进行导数?

【问题讨论】:

    标签: r gaussian differentiation


    【解决方案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 的其他参数由于某种原因没有传递

    【讨论】:

      【解决方案2】:

      你可以自己计算导数并写出来

      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)
      

      【讨论】:

        猜你喜欢
        • 2015-01-04
        • 1970-01-01
        • 2023-03-26
        • 2013-01-30
        • 2013-12-13
        • 1970-01-01
        • 2020-09-08
        • 2015-10-16
        • 2012-03-02
        相关资源
        最近更新 更多