从dnorm获得平均值

时间:2017-09-27 05:49:01

标签: r normal-distribution

在下面的代码中,我试图从normal1和normal2获取平均值,这样我就不必在xintercept函数的geom_vline值(3和0)中进行硬编码调用

normal1 <- function(x) {
    dnorm(x, 3, 3)
}

normal2 <- function(x) {
    dnorm(x, 0, 2)
}

plot + stat_function(fun = normal1) +
       stat_function(fun = normal2) + xlim(c(-10, 15)) +
       geom_vline(xintercept = 3, linetype = "dashed") +
       geom_vline(xintercept = 0, linetype = "dashed")

我希望这样做,而无需在最初的dnorm调用中声明变量并使用它们。即

x1 <- 3
x2 <- 0

normal1 <- function(x) {
    dnorm(x, x1, 3)
}

normal2 <- function(x) {
    dnorm(x, x2, 2)
}

我是R的新手,并且没有很好地掌握它的功能或回报。

1 个答案:

答案 0 :(得分:2)

也许你会尝试这样的事情

plotter <- function(m1,m2){
  normal1 <- function(x) {
    dnorm(x, m1, 3)
  }

  normal2 <- function(x) {
    dnorm(x, m2, 2)
  }
  ggplot(data = data.frame(x=0), mapping = aes(x=x))+ 
  stat_function(fun = normal1) +
    stat_function(fun = normal2) + xlim(-10, 15) +
    geom_vline(xintercept = m1, linetype = "dashed") +
    geom_vline(xintercept = m2, linetype = "dashed")


}

因此您可以重新计算normal1和normal2函数。事实上,它们是使用变量均值创建的,很容易用新值修改绘图。

m_1 <- 4
m_2 <- 2

plotter(m_1, m_2)

或直接用新值执行plotter()函数。

游览

事实上,计算一个函数的平均值,这个函数必然需要创建它的平均值,这有点令人困惑,但并非不可能。

首先修改plotter函数:

normal1 <<- function(x) {
  dnorm(x, m1, 3)
}

因此normal1功能在plotter功能之外可用。

现在我们来看看数学背景:函数的平均值或期望值与密度曲线下面积乘以变量本身一致。

mean1 <- function(x){
normal1(x)*x
}

其中normal1被解释为密度。

mean1_empirical <- integrate(mean1, lower = -Inf, upper = Inf)

对于m_1 <- 4,结果是,例如(!)

4 with absolute error < 0.00019

请注意:将此方法与现有功能一起使用是经验方法。因此,可以以最小的推导率接收结果,但当然是高精度。