【发布时间】:2014-08-29 12:57:54
【问题描述】:
我正在尝试使用 ggplot2 包和 用户定义函数 为其stat_function()。我尝试了两种方法。 分布标识在这两种情况下都是正常的:
number of iterations= 11
summary of normalmixEM object:
comp 1 comp 2
lambda 0.348900 0.65110
mu 2.019878 4.27454
sigma 0.237472 0.43542
loglik at estimate: -276.3643
A) 但是,在第一种方法中,输出包含以下错误:
Error in eval(expr, envir, enclos) : object 'comp.number' not found
此方法的可重现示例如下(忠实是内置R数据集):
library(ggplot2)
library(mixtools)
DISTRIB_COLORS <- c("green", "red")
NUM_COMPONENTS <- 2
set.seed(12345)
mix.info <- normalmixEM(faithful$eruptions, k = NUM_COMPONENTS,
maxit = 100, epsilon = 0.01)
summary(mix.info)
plot.components <- function(mix, comp.number) {
g <- stat_function(fun = function(mix, comp.number)
{mix$lambda[comp.number] *
dnorm(x, mean = mix$mu[comp.number],
sd = mix$sigma[comp.number])},
geom = "line", aes(colour = DISTRIB_COLORS[comp.number]))
return (g)
}
g <- ggplot(faithful, aes(x = waiting)) +
geom_histogram(binwidth = 0.5)
distComps <- lapply(seq(NUM_COMPONENTS),
function(i) plot.components(mix.info, i))
print(g + distComps)
B)第二种方法不会产生任何错误。但是,唯一可见的图是混合分布之一。 没有生成或显示其分量分布图(在我看来,水平直线 y=0 也是可见的,但我不是 100% 确定):
以下是此方法的可重现示例:
library(ggplot2)
library(mixtools)
DISTRIB_COLORS <- c("green", "red")
NUM_COMPONENTS <- 2
set.seed(12345)
mix.info <- normalmixEM(faithful$eruptions, k = NUM_COMPONENTS,
maxit = 100, epsilon = 0.01)
summary(mix.info)
plot.components <- function(x, mix, comp.number, ...) {
mix$lambda[comp.number] *
dnorm(x, mean = mix$mu[comp.number],
sd = mix$sigma[comp.number], ...)
}
g <- ggplot(faithful, aes(x = waiting)) +
geom_histogram(binwidth = 0.5)
distComps <- lapply(seq(NUM_COMPONENTS), function(i)
stat_function(fun = plot.components,
args = list(mix = mix.info, comp.number = i)))
print(g + distComps)
问题:每种方法存在哪些问题,哪一种(更)正确?
更新: 发布几分钟后,我意识到我忘记在第二种方法中包含stat_function() 的画线部分,因此对应的行如下:
distComps <- lapply(seq(NUM_COMPONENTS), function(i)
stat_function(fun = plot.components,
args = list(mix = mix.info, comp.number = i)),
geom = "line", aes(colour = DISTRIB_COLORS[i]))
但是,此更新产生了一个错误,我不太明白其来源:
Error in FUN(1:2[[1L]], ...) :
unused arguments (geom = "line", list(colour = DISTRIB_COLORS[i]))
【问题讨论】:
-
你这里真是一团糟。您的 normalmixEM 函数正在
$eruptions上调用,因此它查看该变量的分布,但您的绘图基于x=waiting,这是一些完全不同的变量。查看汇总输出均值和方差,它们与您的 X 轴值相去甚远。您可能会看到以 2.019 和 4.275 为中心的分布尾部。解决所有这些问题,然后我们将处理各种范围问题以及 fun 应该只是 x 的函数这一事实...... -
@Spacedman:谢谢!已经开始研究这个了。
-
@Spacedman:我修复了错误的变量问题(两种方法都更改为
$waiting)并看到组件识别的改进。但是错误消息保持不变。仍在尝试找出缩放/范围问题。 -
通过允许额外参数 (
...) 修复了方法 2 中的错误。在阅读了有关 StackOverflow (stackoverflow.com/a/25091231/2872891) 和 Hadley 链接的 cmets 的信息后,我了解到所有计算都应在stat_function()和其他ggplot2函数的外部进行,因为环境范围。这部分符合我的方法 2,因此我专注于通过形成具有计算结果的补充数据框并将其传递给geom_line()来修复它。
标签: r plot ggplot2 distribution data-visualization