kryberg
2009-May-06 19:29 UTC
[R] Add trend line to XYPlot using a subset of the original data
I've created an xyplot that I want to add a trend line to using a subset of the data. The xyplot is xyplot(X9444500~WY,data=mynewdata,xlim=c(1900,2020),ylab="TEST", xlab="",ylim=c(100,100000),scales=list(x=list(at=c(1900,1920,1940,1960,1980,2000,2020),axs="r",tck=-1),y=list(log=TRUE,tck=-100,at=c(100,1000,10000,100000))), panel=function(x,y,...) { panel.xyplot(x,y,col=1) panel.lines(x,exp(predict.lm(lm(log(y)~x))),col=4) panel.loess(x,y,span=.7,col=5) },sub="Figure X. Trends in ...", key=list(space="bottom",points=list(col=c(9,0,0,0),pch=1),lines=list(col=c(0,4,2,3),lty=c(1,1,1,1),lwd=c(2,2,2,2)),text=list(as.character(textlabs)),columns=3)) That part works well, but I want to add a trend line using a subset of the data. The additional trend line always has the wrong slope. The slope of the line should be close to zero, but positive. It always plots close to zero, but negative. I've tried adding the following lines to the above panel.lines(x[21:98],exp(predict.lm(lm(log(y[21:98])~x[21:98]))),col=5) or pkyr<-x>1927 panel.lines(x[pkyr],exp(predict.lm(lm(log(y[pkyr])~x[pkyr]))),col=4) or pkyr<-x>1927 my.lm<-lm(log(y[pkyr])~x[pkyr]) panel.lines(x[pkyr],exp(x[pkyr]*(my.lm$coef[2])+my.lm$coef[1]),col=3) or panel.lines(x[pkyr],exp(x[pkyr]*(-my.lm$coef[2])+my.lm$coef[1]),col=3) # this doesn't plot any line And other variations on subsetting the data and calculating the slope. If I create the same using the plot command, the slope of the trend based on the subset of the data is correct. pck<-!is.na(pkdat$X9444500) plot(X9444500~WY,data=pkdat[pck,],xlim=c(1900,2020),ylab="TEST", xlab="",ylim=c(100,100000),yaxp=c(100,100000,1),las=1,tck=.02,log="y",yaxs='i',xaxs='i',mgp=c(3,.5,0)) lines(pkdat$WY[pck],exp(predict.lm(lm(log(pkdat$X9444500[pck])~pkdat$WY[pck]))),col=3) pkyr<-pkdat$WY[pck]>1927 lines(pkdat$WY[pck][pkyr],exp(predict.lm(lm(log(pkdat$X9444500[pck][pkyr])~pkdat$WY[pck][pkyr]))),col=2) my.lo2<-loess(log(pkdat$X9444500[pck])~pkdat$WY[pck],span=.7,degree=1) lines(pkdat$WY[pck],exp(predict(my.lo2)),col=6) I would like to use the xyplot command though because of other graphics control options and other similar graphs for the same project that were created using xyplot. Any suggestions on using a subset of x and y in the xyplot? Thank you -- View this message in context: http://www.nabble.com/Add-trend-line-to-XYPlot-using-a-subset-of-the-original-data-tp23413795p23413795.html Sent from the R help mailing list archive at Nabble.com.
Deepayan Sarkar
2009-May-07 00:53 UTC
[R] Add trend line to XYPlot using a subset of the original data
On Wed, May 6, 2009 at 12:29 PM, kryberg <kryberg at usgs.gov> wrote:> > I've created an xyplot that I want to add a trend line to using a subset of > the data. > > The xyplot is > > xyplot(X9444500~WY,data=mynewdata,xlim=c(1900,2020),ylab="TEST", > xlab="",ylim=c(100,100000),scales=list(x=list(at=c(1900,1920,1940,1960,1980,2000,2020),axs="r",tck=-1),y=list(log=TRUE,tck=-100,at=c(100,1000,10000,100000))), > ? panel=function(x,y,...) { > ? panel.xyplot(x,y,col=1) > ? panel.lines(x,exp(predict.lm(lm(log(y)~x))),col=4) > ? panel.loess(x,y,span=.7,col=5) > ? },sub="Figure X. ?Trends in ...", > key=list(space="bottom",points=list(col=c(9,0,0,0),pch=1),lines=list(col=c(0,4,2,3),lty=c(1,1,1,1),lwd=c(2,2,2,2)),text=list(as.character(textlabs)),columns=3)) > > > That part works well, but I want to add a trend line using a subset of the > data. ?The additional trend line always has the wrong slope. The slope of > the line should be close to zero, but positive. ?It always plots close to > zero, but negative. > > I've tried adding the following lines to the above > > ? panel.lines(x[21:98],exp(predict.lm(lm(log(y[21:98])~x[21:98]))),col=5)Does this work better? panel=function(x,y,...) { panel.xyplot(x,y,col=1) ## panel.lines(x,exp(predict.lm(lm(log(y)~x))),col=4) panel.lmline(lm(y ~ x), col=4) panel.loess(x,y,span=.7,col=5) panel.lmline(lm(y ~ x, subset = x > 1927), col=4) } Unlike your plot() example, y is already log-transformed in the panel function. -Deepayan