[R] Help resolving issues with generating a chi-squared density plot from scratch
David Winsemius
dwinsemius at comcast.net
Mon Mar 10 13:02:17 CET 2014
If you set range of x in [0, something ] for for a function that goes to infinity for x=0, then what do you expect?
> On Mar 10, 2014, at 7:30 AM, Levi Robinson <robinsle at gmail.com> wrote:
>
> I wrote the code to graph a chi-squared density function, shade the
> percentile, and point to the CV, but it has a few issues I can't seem to
> resolve
>
> 1. It won't work at all for DF = 1 due to ylim going to infinity, but I
> haven't been able to resolve this still after hours of trying.
> 2) The y-axis is numbered only relatively; I'd prefer they were the actual
> prob densities, but again, I fiddled with a few things, but it just
> wouldn't get me what I wanted.
> 3) For low degrees of freedom and higher percentiles, the arrow pointing to
> CV seems to end up going diagonal instead of straight down
>
> Here's the code below and here's the URL for R fiddle for the code which
> might make it easier to fix:
> http://www.r-fiddle.org/#/fiddle?id=ChFi0dyJ&version=4
>
>
> chi.dens = function(x = NULL, df = NULL, cv = NULL) {
>
> # x = percentile/quantile
> # df = degrees of freedom
> # cv = critical value
>
> if(x>1 ||x<0) stop("Percentile must be between 0 and 1") #
> Error-handling
>
>
> qend = qchisq(x, df)
> perc = x
>
> qt0=qchisq(0.5, df) # Defining for arrows later
> dy0=dchisq(0.45, df) # Defining for arrows later
>
> xrange = qchisq (0.999, df)
> x = seq(0, xrange)
> y = dchisq(x, df)
> yheight = max(dchisq(x, df))
>
> # Creating plot
> plot(x,y,type = "l", ylim=c(0,yheight),axes=FALSE)
>
> title( "Chi-squared Density Curve with")
> mtext(bquote(paste("DF = ", .(df), " and Percentile = ", .(perc))),
> side = 3, line = 0) # Input information
>
> # Shading left tail-region
>
> qt = signif(qend,5)
> x0=seq(0, qt)
> y0=dchisq(x0, df)
> polygon(c(0, x0, qt), c(0, y0, 0), col = "lightblue")
> xtks=signif(seq(0,xrange,length=10),3)
> axis(1, pos=0, at=xtks, labels=xtks)
> y.unit=max(dchisq(x, df))/5
> y.pos=seq(0,5*y.unit, length=5)
> y.lab=c(0, 1, 2, 3, 4) # Y axis numbers only reflect relative
> densities to each other.
> axis(2,pos=0, at=y.pos, labels=y.lab) # set up y-axis
>
> # "Normal" CV less than the 99.9 Percentile:
>
> if(qt <= xrange){
> if(length(cv)==0) text(0.75*xrange,3*y.unit, bquote(paste("CV = ",
> .(qend))), cex=1.2, col = "red",adj=0.5)
> #
> if(length(perc)==1) text(0.35*xrange,3*y.unit, paste("Area = ",
> perc), cex=1.2, col="darkblue", adj=0.5)
> if(perc>0.5){
> arrows(0.35*xrange, 2.5*y.unit, qt0, 0.3*dy0, length=0.1,
> angle=20) # pointing to the shaded region
> }
> if(perc<=0.5){
> arrows(0.35*xrange, 2.5*y.unit, qt/2, 0.3*dy0, length=0.1,
> angle=20) # pointing to the shaded region
> }
> arrows(0.75*xrange, 2.5*y.unit, qt, 0, length=0.1, angle=20)
> points(qt,0,pch=17, col="red")
> }
>
> # When CV is greater than the 99.9 Percentile:
>
> if(qt > xrange){
>
> print("CV may be too far to the right to be shown on graph due to the
> high percentile")
>
> if(length(cv)==0) text(0.75*xrange,3*y.unit, bquote(paste("CV = ",
> .(qend))), cex=1.2, col = "red",adj=0.5)
>
> if(length(perc)==1) text(0.35*xrange,3*y.unit, paste("Area = ",
> perc), cex=1.2, col="darkblue", adj=0.5)
> if(perc>0.5){
> arrows(0.35*xrange, 2.5*y.unit, qt0, 0.3*dy0, length=0.1,
> angle=20) # pointing to the shaded region
> }
> if(perc<=0.5){
> arrows(0.35*xrange, 2.5*y.unit, qt/2, 0.3*dy0, length=0.1,
> angle=20) # pointing to the shaded region
> }
> arrows(0.75*xrange, 2.5*y.unit, qt, 0, length=0.1, angle=20)
> points(qt,0,pch=17, col="red")
> }
>
> }
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> 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.
More information about the R-help
mailing list