2017-09-27 151 views
0

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

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

哦,谢谢你,你的评论让我意识到我使用的'plot'是控制台内存中的一个变量,我从代码中删除了它。 'plot < - ggplot(x,aes(x))' – Kebtiz

+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") 


} 

这样你就可以重新计算正常1和正常2功能。实际上,它们是用变量平均值创建的,很容易用新值修改绘图。或者直接用新值执行绘图仪()函数。


游览

事实上,计算这必然需要平均为它建立一个函数的均值是有点混乱,但并非不可能。

首先修改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 

请注意:使用此方法与现有的功能是经验方法。所以有可能以最小的推导获得结果,但当然是高精度的。

+0

这比我做这件事的方式要干净得多,而且对于这个例子来说效果很好,但我希望有一种方法可以在事实之后真正提取出平均值。所以如果我通过一个裸露的阴谋,我可以添加'geom_vline'。 – Kebtiz

+1

@Kebtiz,希望我可以帮助一下游览 –

+0

是的,谢谢。这个例子非常有帮助。 – Kebtiz