[R] Plotting Confidence Intervals into a density plot

Jim Lemon
Fri, 02 Dec 2016 10:45:24 -0000

Hang on, maybe you mean something like this:

erupt_dens<-density(faithful$eruptions)
plot(erupt_dens,ylim=c(0,0.65))
dispersion(erupt_dens$x,erupt_dens$y,ulim=erupt_dens$y/5,
 type="l",fill="lightgray",interval=TRUE)
lines(erupt_dens)

Jim


On Fri, Dec 2, 2016 at 9:36 PM, Jim Lemon <drjimlemon at gmail.com>
wrote:
> In order to display a polygon, you need x/y pairs for each point. If
> you just want a rectangle, you only need four x/y pairs, e.g.:
>
> plot(0,xlim=x(2.44,2.57),ylim=c(0,1),type="n")
> polygon(c(2.44,2.57,2.57,2.44),c(0,0,1,1),col="lightgray")
>
> Now if you have a series of x values and want to display a band of
> constant width around it:
>
> y_values<-runif(14)
> plot(seq(2.44,2.57,by=0.01),y_values,ylim=c(-2,3))
> dispersion(seq(2.44,2.57,by=0.01),y_values,ulim=rep(0.5,14),
>  type="l",interval=TRUE,col="lightgray")
> lines(seq(2.44,2.57,by=0.01),y_values)
>
> Jim
>
> On Fri, Dec 2, 2016 at 8:59 PM, Elysa Mitova <elysa.mitova at
gmail.com> wrote:
>> Thank you,
>>
>> this seems to work, but it is not exactly what I need (it indeed looks
>> great, but a bit beyond my understanding)
>>
>> I just need a shaded area between  2.44 to 2.57 along the x-axis - a
polygon
>> inserted into my density plot (and not a confidence line along a
scatter
>> plot like your suggested solution)
>>
>> My x-axis is an index (a data frame), my y-axis is the automatically
>> constructed density
>>
>> On Fri, Dec 2, 2016 at 10:01 AM, Jim Lemon <drjimlemon at
gmail.com> wrote:
>>>
>>> Hi Elysa,
>>> I think you are going a bit off course in your example. Try this
and
>>> see if it is close to what you want:
>>>
>>> data<-rnorm(100)+runif(100,0,15)
>>> smu_data<-supsmu(1:100,data)
>>> rollfun<-function(x,window=10,FUN=sd) {
>>>  xlen<-length(x)
>>>  xout<-NA
>>>  forward<-window%/%2
>>>  backward<-window-forward
>>>  for(i in 1:xlen) {
>>>   xstart<-i-backward
>>>   if(xstart < 1) xstart<-1
>>>   xend<-i+forward-1
>>>   if(xend > xlen) xend<-xlen
>>>   xout[i]<-do.call(FUN,list(x[xstart:xend],na.rm=TRUE))
>>>  }
>>>  return(xout)
>>> }
>>> mad_data<-rollfun(data,10,mad)
>>> plot(data,ylim=c(0,17))
>>> library(plotrix)
>>>
dispersion(smu_data$x,smu_data$y,mad_data,type="l",interval=TRUE,
>>>  fill="lightgray")
>>> lines(smu_data,lwd=2)
>>> points(1:100,data)
>>>
>>> Jim
>>>
>>>
>>> On Fri, Dec 2, 2016 at 7:18 PM, Elysa Mitova <elysa.mitova at
gmail.com>
>>> wrote:
>>> > Hi, thank you!
>>> >
>>> > I've constructed the upper and lower bounds with
>>> >
>>> >  a <- 2.505766
>>> >  s <- 0.7789832
>>> >  n <- 607
>>> >  error <- qnorm(0.975)*s/sqrt(n)
>>> >  left <- a-error
>>> >  right <- a+error
>>> >  left
>>> > right
>>> >
>>> > Now, I have the numbers I need, but I have no idea how to plot
them. I
>>> > was
>>> > thinking of using a polygon, but somehow it doesn't work
out, because my
>>> > y-axis shows only density and is in itself not a variable?
>>> >
>>> > xx <- data
>>> >
>>> > fit1 <- density(data,na.rm=TRUE)
>>> >
>>> > fit2 <- replicate(10000, { x <- sample(xx,
replace=TRUE);
>>> >         density(x, na.rm=TRUE, from=min(fit1$x),
to=max(fit1$x))$y } )
>>> >
>>> > fit3 <- apply(fit2, 1, quantile, c(0.025,0.975) )  -
Probably herein
>>> > lies the problem?
>>> >
>>> > plot(fit1, ylim=range(fit3))
>>> > polygon( c(fit1$x, rev(fit1$x)), c(fit3[1,], rev(fit3[2,])),
>>> > col='grey', border=F)
>>> > lines(fit1)
>>> >
>>> > I tried working with this solution I found on the internet,
but
>>> > somehow now the lines the shaded areas sporadically everywhere
around
>>> > my density plot? I just want a polygon spreading from  2.44 to
2.57
>>> > along the x-axis.
>>> >
>>> >
>>> > Any tipps?
>>> >
>>> >
>>> >
>>> >
>>> > On Fri, Dec 2, 2016 at 1:24 AM, David Winsemius <dwinsemius
at comcast.net>
>>> > wrote:
>>> >
>>> >>
>>> >> > On Dec 1, 2016, at 12:10 PM, Elysa Mitova
<elysa.mitova at gmail.com>
>>> >> wrote:
>>> >> >
>>> >> > Hi,
>>> >> >
>>> >> > I am desperately looking for a way to plot confidence
intervals into
>>> >> > a
>>> >> > density plot of only one variable (not a scatter plot
etc.)
>>> >> >
>>> >> > Have you any advice how to do this?
>>> >> >
>>> >> > I've only found manual ways to do with
"abline", but this is a rather
>>> >> > bothersome method and only works with ggplot (and not
ggplot2).
>>> >>
>>> >> This makes it appear that you expect this to be done in
ggplot2
>>> >> automagically. I suspect you must instead first find the
right approach
>>> >> to
>>> >> construction of those upper and lower bounds before
plotting. It's not
>>> >> clear what methods you expect to be needed. Your
desperation is not a
>>> >> guide. Perhaps trying a bit of searching?
>>> >>
>>> >> install.packages("sos")
>>> >> library(sos)
>>> >> findFn("confidence intervals density estimates")
>>> >>
>>> >>
>>> >> Delivers quite a few results. Then searching on the text
within that
>>> >> webpage you find
>>> >>
>>> >>
>>> >> 208     2       27      54      nprobust        kdrobust
>>> >> 2016-11-14
>>> >> 16:41:50     27      Kernel Density Estimation with Robust
Confidence
>>> >> Intervals
>>> >> 209     2       27      54      nprobust        lprobust
>>> >> 2016-11-14
>>> >> 16:41:50     27      Local-Polynomial Estimation with
Robust Confidence
>>> >> Intervals
>>> >>
>>> >> Is that what you seek?
>>> >>
>>> >> >
>>> >> > Thank you!
>>> >> >
>>> >> >       [[alternative HTML version deleted]]
>>> >> I know you just subscribed, so now is the time to read the
Posing
>>> >> Guide.
>>> >>
>>> >> =>>> >>
>>> >> David Winsemius
>>> >> Alameda, CA, USA
>>> >>
>>> >>
>>> >
>>> >         [[alternative HTML version deleted]]
>>> >
>>> > ______________________________________________
>>> > R-help at r-project.org mailing list -- To UNSUBSCRIBE and
more, see
>>> > https://stat.ethz.ch/mailman/listinfo/r-help
>>> > PLEASE do read the posting guide
>>> > http://www.R-project.org/posting-guide.html
>>> > and provide commented, minimal, self-contained, reproducible
code.
>>
>>