【问题标题】:Adding an exponential geom_smooth in ggplot2 / R在 ggplot2 / R 中添加指数 geom_smooth
【发布时间】:2010-08-20 10:25:50
【问题描述】:

我正在尝试使用 ggplot2 生成一些示例图形,我选择的示例之一是 birthday problem,这里使用的代码“借用”自 Oscon 的革命 computing presentation

birthday<-function(n){
    ntests<-1000
    pop<-1:365
    anydup<-function(i){
        any(duplicated(sample(pop,n,replace=TRUE)))
        }
    sum(sapply(seq(ntests), anydup))/ntests
    }

x<-data.frame(x=rep(1:100, each=5)) 
x<-ddply(x, .(x), function(df) {return(data.frame(x=df$x, prob=birthday(df$x)))})
birthdayplot<-ggplot(x, aes(x, prob))+
        geom_point()+geom_smooth()+
        theme_bw()+
        opts(title = "Probability that at least two people share a birthday in a random group")+
        labs(x="Size of Group", y="Probability")

这里我的图表是我将其描述为指数的,但 geom_smooth 并不特别适合数据。我试过黄土方法,但这并没有改变太多。谁能建议如何添加更好的平滑度?

谢谢

保罗。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    平滑例程对x 的低值的突然变化反应不够快(并且它无法知道prob 的值被限制在0-1 范围内)。由于您的可变性如此之低,一个快速的解决方案是减少在每个点进行平滑的值的范围。查看此图中的红线:

    birthdayplot + geom_smooth(span=0.1, colour="red")
    

    【讨论】:

      【解决方案2】:

      问题在于概率遵循逻辑曲线。如果您更改生日函数以返回原始成功和失败而不是概率,则可以拟合适当的平滑线。

      birthday<-function(n){
        ntests<-1000
        pop<-1:365
        anydup<-function(i){
          any(duplicated(sample(pop,n,replace=TRUE)))
        }
        data.frame(Dups = sapply(seq(ntests), anydup) * 1, n = n)
      }
      x<-ddply(x, .(x),function(df) birthday(df$x))
      

      现在,您必须将点添加为摘要,并将逻辑回归指定为平滑类型。

      ggplot(x, aes(n, Dups)) +
        stat_summary(fun.y = mean, geom = "point") +
        stat_smooth(method = "glm", family = binomial)
      

      【讨论】:

      • 曲线不是真正的逻辑,即使它是 S 形的。您可以在原始图上使用scale_y_logit() 看到它
      • 嗯,对。我不确定合适的回归是什么,但是拥有原始数字仍然可以让您与stat_smooth()匹配。
      猜你喜欢
      • 2020-06-06
      • 2011-03-02
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多