我有一些看起来像这样的数据(实际上有更多的数据):
size program group percent
1 prog1 1 50
2 prog1 1 0.1
1 prog1 2 75
2 prog1 2 1
1 prog2 1 55
2 prog2 1 2
1 prog2 2 70
2 prog2 2 4
我想用这样的东西来绘制:
plot1 <- ggplot(tbl, aes(size, percent, group=group, color=group))+
geom_point()+
stat_summary(fun.y=gm_mean, geom='line')+
scale_x_continuous(trans=log2_trans())+
scale_y_continuous(trans=log2_trans())
gm_mean <- function(x) {
exp(mean(log(x)))
}
如果我尝试运行此操作,我会收到此警告:
在loop_apply(n,do.ply)中:生成NaN
我打印出了我在gm_mean中获得的值,我发现它们不是我期望的实际值,但它们看起来像这些值的log2。 (0.1变为-3.3,然后从log()
得到NaN我认为)
这是否意味着使用fun.y = mean会在使用scale_y_continuous(trans = log2_trans())时实际计算几何平均数?
如果不是,您将如何获得几何平均值,如果是,如果需要,您将如何获得具有对数刻度的实际平均值?
我尝试做的是制作一种散点图,然后绘制2条几何平均线(每组一条),但是按log2标度。
答案 0 :(得分:0)
这是否意味着使用fun.y = mean会在使用scale_y_continuous(trans = log2_trans())时实际计算几何平均值?
是的,我认为这确实意味着。以下是一些试用数据的例子:
#packages
require(ggplot2)
require(scales)
#gm_mean function:
gm_mean <- function(x){exp(mean(log(x)))}
#trial data
df <- data.frame(x=sample(1:5, size=100, replace=T),
group=factor(sample(c(1,2,3), size=100, replace=T)))
df$y <- df$x*as.numeric(as.character(df$group))+rnorm(100)+1
#create one outlier for easier visual differences between geomean and arithmean
df[df$x==1&df$group==1,][1,'y'] <- 30
#create base plots
d <- qplot(data=df, x=x, y=y, group=group, color=group) + theme_bw()
d2 <- d + scale_y_continuous(trans=log2_trans()) +
scale_x_continuous(trans=log2_trans())
#comparing different plots
quartz(width=4, height=4)
d + stat_summary(fun.y=mean, geom='line') + labs(title='untransformed arithmean')
quartz(width=4, height=4)
d + stat_summary(fun.y=gm_mean, geom='line') + labs(title='untransformed geomean')
quartz(width=4, height=4)
d2 + stat_summary(fun.y=mean, geom='line') + labs(title='transformed arithmean')
quartz(width=4, height=4)
d2 + stat_summary(fun.y=gm_mean, geom='line') + labs(title='transformed geomean')
观察:
在具有算术平均值的变换图上,组1的线与具有几何平均值的未变换图的线相同。 因此,你是对的。
相反,使用算术平均值的未转换图上的同一行更容易被人工异常值扭曲。
用几何平均值转换的图上的相同线条是没有意义的,并且遇到了许多NaN问题。您不应该使用具有对数变换轴的几何方法。
还有一个想法:您确定要stat_summary()
代替stat_smooth()
吗?您的数据在x轴上只有两个点,所以我无法确定,但在我看来,通过示例数据,这些图表提供了更多信息:
quartz(width=4, height=4)
d2 + stat_smooth(method='lm', formula=y~x, se=F) +
labs(title='stat_smooth transformed')
quartz(width=4, height=4)
d + stat_smooth(method='lm', formula=y~I(2^log(x,2)), se=F) +
labs(title='stat_smooth untransformed')