### R code from vignette source 'partDeriv.Rnw' ################################################### ### code chunk number 1: init ################################################### set.seed(42) options(width=80) options(continue=" ") options(SweaveHooks=list(fig=function() par(mar=c(5.1, 4.1, 1.1, 2.1)))) library(interp) library(Deriv) library(Ryacas) library(gridExtra) library(grid) library(ggplot2) library(lattice) ################################################### ### code chunk number 2: partDeriv.Rnw:415-416 ################################################### ng <- 11 ################################################### ### code chunk number 3: partDeriv.Rnw:421-422 ################################################### knl <- "gaussian" ################################################### ### code chunk number 4: partDeriv.Rnw:429-431 ################################################### bwg <- 0.33 bwl <- 0.11 ################################################### ### code chunk number 5: partDeriv.Rnw:444-445 ################################################### dg=3 ################################################### ### code chunk number 6: partDeriv.Rnw:448-449 ################################################### f <- function(x,y) (x-0.5)*(x-0.2)*(y-0.6)*y*(x-1) ################################################### ### code chunk number 7: helperR2Yacas ################################################### # helper functions for translation between R and Yacas fn_y <- function(f){ b <- toString(as.expression(body(f))) b <- stringr::str_replace_all(b,"cos","Cos") b <- stringr::str_replace_all(b,"sin","Sin") b <- stringr::str_replace_all(b,"exp","Exp") b <- stringr::str_replace_all(b,"log","Log") b <- stringr::str_replace_all(b,"sqrt","Sqrt") b } ################################################### ### code chunk number 8: helperYacas2R ################################################### ys_fn <- function(f){ f <- stringr::str_replace_all(f,"Cos","cos") f <- stringr::str_replace_all(f,"Sin","sin") f <- stringr::str_replace_all(f,"Exp","exp") f <- stringr::str_replace_all(f,"Log","log") f <- stringr::str_replace_all(f,"Sqrt","sqrt") f } ################################################### ### code chunk number 9: helperDerivs ################################################### derivs <- function(f,dg){ ret<-list(f=f, f_str=ys_fn(yac(paste("Simplify(",y_fn(fn_y(f),""),")")))) if(dg>0){ ret$fx <- function(x,y){ myfx <- Deriv(f,"x"); tmp <- myfx(x,y); if(length(tmp)==1) return(rep(tmp,length(x))) else return(tmp) } ret$fx_str <- ys_fn(yac(paste("Simplify(",y_fn(fn_y(f),"D(x)"),")"))) ret$fy <- function(x,y){ myfy <- Deriv(f,"y"); tmp <- myfy(x,y); if(length(tmp)==1) return(rep(tmp,length(x))) else return(tmp) } ret$fy_str <- ys_fn(yac(paste("Simplify(",y_fn(fn_y(f),"D(y)"),")"))) if(dg>1){ ret$fxy <- function(x,y){ myfxy <- Deriv(Deriv(f,"y"),"x"); tmp <- myfxy(x,y); if(length(tmp)==1) return(rep(tmp,length(x))) else return(tmp) } ret$fxy_str <- ys_fn(yac(paste("Simplify(",y_fn(fn_y(f),"D(x)D(y)"),")"))) ret$fxx <- function(x,y){ myfxx <- Deriv(Deriv(f,"x"),"x"); tmp <- myfxx(x,y); if(length(tmp)==1) return(rep(tmp,length(x))) else return(tmp) } ret$fxx_str <- ys_fn(yac(paste("Simplify(",y_fn(fn_y(f),"D(x)D(x)"),")"))) ret$fyy <- function(x,y){ myfyy <- Deriv(Deriv(f,"y"),"y"); tmp <- myfyy(x,y); if(length(tmp)==1) return(rep(tmp,length(x))) else return(tmp) } ret$fyy_str <- ys_fn(yac(paste("Simplify(",y_fn(fn_y(f),"D(y)D(y)"),")"))) if(dg>2){ ret$fxxy <- function(x,y){ myfxxy <- Deriv(Deriv(Deriv(f,"y"),"x"),"x"); tmp <- myfxxy(x,y); if(length(tmp)==1) return(rep(tmp,length(x))) else return(tmp) } ret$fxxy_str <- ys_fn(yac(paste("Simplify(",y_fn(fn_y(f),"D(x)D(x)D(y)"),")"))) ret$fxyy <- function(x,y){ myfxyy <- Deriv(Deriv(Deriv(f,"y"),"y"),"x"); tmp <- myfxyy(x,y); if(length(tmp)==1) return(rep(tmp,length(x))) else return(tmp) } ret$fxyy_str <- ys_fn(yac(paste("Simplify(",y_fn(fn_y(f),"D(x)D(y)D(y)"),")"))) ret$fxxx <- function(x,y){ myfxxx <- Deriv(Deriv(Deriv(f,"x"),"x"),"x"); tmp <- myfxxx(x,y); if(length(tmp)==1) return(rep(tmp,length(x))) else return(tmp) } ret$fxxx_str <- ys_fn(yac(paste("Simplify(",y_fn(fn_y(f),"D(x)D(x)D(x)"),")"))) ret$fyyy <- function(x,y){ myfyyy <- Deriv(Deriv(Deriv(f,"y"),"y"),"y"); tmp <- myfyyy(x,y); if(length(tmp)==1) return(rep(tmp,length(x))) else return(tmp) } ret$fyyy_str <- ys_fn(yac(paste("Simplify(",y_fn(fn_y(f),"D(y)D(y)D(y)"),")"))) } } } ret } ################################################### ### code chunk number 10: partDeriv.Rnw:583-584 ################################################### df <- derivs(f,dg) ################################################### ### code chunk number 11: partDeriv.Rnw:587-590 ################################################### xg <- seq(0,1,length=ng) yg <- seq(0,1,length=ng) xyg <- expand.grid(xg,yg) ################################################### ### code chunk number 12: partDeriv.Rnw:592-593 ################################################### af=4 ################################################### ### code chunk number 13: partDeriv.Rnw:597-601 ################################################### af <- 4 xfg <- seq(0,1,length=af*ng) yfg <- seq(0,1,length=af*ng) xyfg <- expand.grid(xfg,yfg) ################################################### ### code chunk number 14: partDeriv.Rnw:604-608 ################################################### nx <- length(xg) ny <- length(yg) xx <- t(matrix(rep(xg,ny),nx,ny)) yy <- matrix(rep(yg,nx),ny,nx) ################################################### ### code chunk number 15: helperGrid ################################################### # for plots of exact values fgrid <- function(f,xg,yg,dg){ ret <- list(f=outer(xg,yg,f)) df <- derivs(f,dg) if(dg>0){ ret$fx <- outer(xg,yg,df$fx) ret$fy <- outer(xg,yg,df$fy) if(dg>1){ ret$fxy <- outer(xg,yg,df$fxy) ret$fxx <- outer(xg,yg,df$fxx) ret$fyy <- outer(xg,yg,df$fyy) if(dg>2){ ret$fxxy <- outer(xg,yg,df$fxxy) ret$fxyy <- outer(xg,yg,df$fxyy) ret$fxxx <- outer(xg,yg,df$fxxx) ret$fyyy <- outer(xg,yg,df$fyyy) } } } ret } ################################################### ### code chunk number 16: partDeriv.Rnw:636-640 ################################################### ## data for local regression fg <- outer(xg,yg,f) ## data for exact plots on fine grid ffg <- fgrid(f,xfg,yfg,dg) ################################################### ### code chunk number 17: partDeriv.Rnw:644-648 ################################################### ## global bandwidth: pdg <- interp::locpoly(xg,yg,fg, input="grid", pd="all", h=c(bwg,bwg), solver="QR", degree=dg,kernel=knl,nx=af*ng,ny=af*ng) ## local bandwidth: pdl <- interp::locpoly(xg,yg,fg, input="grid", pd="all", h=bwl, solver="QR", degree=dg,kernel=knl,nx=af*ng,ny=af*ng) ################################################### ### code chunk number 18: helperSplit ################################################### split_str <- function(txt,l){ start <- seq(1, nchar(txt), l) stop <- seq(l, nchar(txt)+l, l)[1:length(start)] substring(txt, start, stop) } ################################################### ### code chunk number 19: helperImage ################################################### grid2df <- function(x,y,z) subset(data.frame(x = rep(x, nrow(z)), y = rep(y, each = ncol(z)), z = as.numeric(z)), !is.na(z)) gg1image2contours <- function(x,y,z1,z2,z3,xyg,ttl=""){ breaks <- pretty(seq(min(z1,na.rm=T),max(z1,na.rm=T),length=11)) griddf1 <- grid2df(x,y,z1) griddf2 <- grid2df(x,y,z2) griddf3 <- grid2df(x,y,z3) griddf <- data.frame(x=griddf1$x,y=griddf1$y,z1=griddf1$z,z2=griddf2$z,z3=griddf3$z) ggplot(griddf, aes(x=x, y=y, z = z1)) + ggtitle(ttl) + theme(plot.title = element_text(size = 6, face = "bold"), axis.line=element_blank(),axis.text.x=element_blank(), axis.text.y=element_blank(),axis.ticks=element_blank(), axis.title.x=element_blank(), axis.title.y=element_blank(),legend.position="none", panel.background=element_blank(),panel.border=element_blank(),panel.grid.major=element_blank(), panel.grid.minor=element_blank(),plot.background=element_blank()) + geom_contour_filled(breaks=breaks) + scale_fill_brewer(palette = "YlOrRd") + geom_contour(aes(z=z2),breaks=breaks,color="green",lty="dashed",lwd=0.5) + geom_contour(aes(z=z3),breaks=breaks,color="blue",lty="dotted",lwd=0.5) + theme(legend.position="none") + geom_point(data=xyg, aes(x=Var1,y=Var2), inherit.aes = FALSE,size=1,pch="+") } ################################################### ### code chunk number 20: helperPrint ################################################### print_deriv <- function(txt,l,at=42){ ret<-"" for(t in txt){ if(stringi::stri_length(t)