diff --git a/NAMESPACE b/NAMESPACE index ced143cedaa370ee87b2c33d21141f99d89862a8..776c53ed63afff0ae1e87245f60010a574a16a6b 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,6 +1,7 @@ # Generated by roxygen2 (4.1.1): do not edit by hand export(biasBox) +export(loessGui) export(polyGui) export(subsetDropAll) export(twoStripCombined) diff --git a/R/loessGui.R b/R/loessGui.R new file mode 100644 index 0000000000000000000000000000000000000000..2ec9d051e374c38de1a06045f5770021eda15804 --- /dev/null +++ b/R/loessGui.R @@ -0,0 +1,218 @@ +#' @title Loess regression GUI +#' +#' @name loessGui +#' +#' @description This function opens an interface to control the settings +#' of a loess regression: +#' \itemize{ +#' \item degree choose the local polynomial degree with a radio +#' selector; +#' \item span set the span value that controls the degree of +#' smoothing; +#' \item center move the x value to be predicted; +#' } +#' +#' The elements of the interface change a plot that shows the observed +#' values and the corresponding fitted curve superimposed with +#' confidence bands (for the fitted values). It assumes that +#' \code{gWidgets} and \code{gWidgetstcltk} packages are available. +#' +#' @param x,y independent and dependent (numeric) regression variables. +#' +#' @param data an optional \code{data.frame}. +#' +#' @param er stands for extend range. It is used to extend the plotting +#' range by a fraction on both sides and directions. Default is +#' 0.05. See \link[grDevices]{extendrange}. +#' +#' @return None is returned by the function, only a GUI is opened. +#' +#' @import gWidgets gWidgetstcltk +#' +#' @author Walmes Zeviani, \email{walmes@@ufpr.br} +#' +#' @export +#' @examples +#' \donttest{ +#' +#' library(gWidgets) +#' library(gWidgetstcltk) +#' +#' loessGui(x=area, y=peri, data=rock, er=0.3) +#' loessGui(x=speed, y=dist, data=cars, er=0.3) +#' loessGui(x=eruptions, y=waiting, data=faithful, er=0.3) +#' +#' } +loessGui <- function(x, y, data, er=0.05){ + ## + ##------------------------------------------- + ## Loading the required packages. + ## + if (!requireNamespace("gWidgets", quietly=TRUE)){ + stop("`gWidgets` needed for this function to work. Please install it.", + call.=FALSE) + } + if (!requireNamespace("gWidgetstcltk", quietly=TRUE)){ + stop("`gWidgetstcltk` needed for this function to work. Please install it.", + call.=FALSE) + } + options(guiToolkit="tcltk") + ## + ##------------------------------------------- + ## Auxiliary variables not controled by the GUI. + ## + xlab <- deparse(substitute(x)) + ylab <- deparse(substitute(y)) + if(!missing(data)){ + da <- eval(data, envir=parent.frame()) + x <- da[, deparse(substitute(x))] + y <- da[, deparse(substitute(y))] + } + xl <- range(x) + nx <- length(x) + erx <- extendrange(xl, f=er) + ery <- extendrange(y, f=er) + newdata <- data.frame(x=seq(erx[1], erx[2], length.out=200)) + ## + ##------------------------------------------- + ## Functions to annotate in the plot upper margin. + ## + annotations <- function(m0, y){ + mtext(side=3, adj=0, line=1.5, + text=sprintf("H trace: %0.2f", m0$trace.hat)) + mtext(side=3, adj=0, line=0.5, + text=sprintf("Equivalent num. param.: %0.2f", m0$enp)) + r2 <- 100*cor(fitted(m0), y)^2 + mtext(side=3, adj=1, line=1.5, + text=sprintf("R^2: %0.2f", r2)) + } + ## + ##------------------------------------------- + ## Functions to adjust 0 order, 1 and 2 local polynomial regression + ## model. + ## + f0 <- function(w, xl){ + y.pred <- sum(w*y)/sum(w) + segments(xl[1], y.pred, xl[2], y.pred, col=2) + } + f1 <- function(w, xl){ + m <- lm(y~poly(x, degree=1), weights=w) + y.pred <- predict(m, newdata=list(x=xl)) + segments(xl[1], y.pred[1], xl[2], y.pred[2], col=2) + } + f2 <- function(w, xl){ + m <- lm(y~poly(x, degree=2), weights=w) + x.pred <- seq(xl[1], xl[2], length.out=20) + y.pred <- predict(m, newdata=list(x=x.pred)) + lines(x.pred, y.pred, col=2) + } + ## + ##------------------------------------------- + ## Reactive function. + ## + draw.loess <- function(...){ + ## + ##------------------------------------------- + ## Fit loess regression. + ## + m0 <- loess(formula=y~x, + span=svalue(SPAN), + degree=as.integer(svalue(DEGREE)), + family="gaussian") + ## + ##------------------------------------------- + ## Predicted values with confidence bands. + ## + pred <- predict(m0, newdata=newdata, se=TRUE) + pred$me <- pred$se.fit*1.96 + pred$ci <- sweep(x=cbind(fit=0, lwr=-pred$me, upr=pred$me), + MARGIN=1, STATS=pred$fit, FUN="+") + ## + ##------------------------------------------- + ## Weights to be used in local polynomial. + ## + x0 <- svalue(XCENTER) + sp <- svalue(SPAN) + a <- abs(x-x0) + if (sp < 1){ + q <- as.integer(sp*nx) + d <- sort(a)[q] + } else { + q <- nx + d <- max(abs(a))*sqrt(sp) + } + s <- a <= d + w <- rep(0, nx) + w[s] <- (1-(a[s]/d)^3)^3 + ## + ##------------------------------------------- + ## Scatter plot, point size proportional to weight. + ## + i <- as.integer(s) + plot(x, y, + pch=2*(!s)+1, cex=i*3*w+1, + xlim=erx, ylim=ery) + ## + ##------------------------------------------- + ## Local polynomial. + ## + xl[1] <- ifelse(x0 - d>xl[1], x0-d, xl[1]) + xl[2] <- ifelse(x0 + d<xl[2], x0+d, xl[2]) + matlines(x=newdata$x, y=pred$ci, lty=c(1,2,2), col=1) + abline(v=c(x0, xl), lty=c(2,3,3)) + annotations(m0, y) + mtext(side=3, adj=1, line=0.5, + text=sprintf("Number of obs. used/total: %i/%i", + sum(s), nx)) + ## NOTE: usar action aqui! + ## xl <- c(min(c(xl[1], x0)), max(c(x0, xl[2]))) + do.call(what=paste0("f", svalue(DEGREE)), + args=list(w=w, xl=xl)) + } + ## + ##------------------------------------------- + ## Building the GUI. + ## + WDW <- gwindow(title="LOESS regression", visible=FALSE) + GG <- ggroup(container=WDW, expand=TRUE, horizontal=FALSE) + GF_DG <- gframe(text="Local polynomial degree:", container=GG) + DEGREE <- gradio(items=0:2, selected=2L, horizontal=TRUE, + handler=draw.loess, + container=GF_DG) + GF_XC <- gframe(text="Predicted point:", expand=TRUE, container=GG) + XCENTER <- gslider(from=erx[1], to=erx[2], + value=mean(erx), + length.out=51, + handler=draw.loess, + expand=TRUE, + container=GF_XC) + XCLABEL <- glabel(text=sprintf("%0.2f", svalue(XCENTER)), + container=GF_XC) + addHandlerChanged(XCENTER, + action=XCLABEL, + handler=function(h, ...){ + svalue(h$action) <- + sprintf("%0.2f", svalue(h$obj)) + }) + GF_SP <- gframe(text="Span:", expand=TRUE,container=GG) + SPAN <- gslider(from=0, to=1.5, + value=0.75, by=0.05, + handler=draw.loess, + expand=TRUE, + container=GF_SP) + SPLABEL <- glabel(text=sprintf("%0.2f", svalue(SPAN)), + container=GF_SP) + addHandlerChanged(SPAN, + action=SPLABEL, + handler=function(h, ...){ + svalue(h$action) <- + sprintf("%0.2f", svalue(h$obj)) + }) + ##------------------------------------------- + ## Initializing. + svalue(SPAN) <- 0.75 + svalue(DEGREE) <- 1L + svalue(XCENTER) <- mean(erx) + do.call(what=draw.loess, args=list(NA)) + visible(WDW) <- TRUE +} diff --git a/man/loessGui.Rd b/man/loessGui.Rd new file mode 100644 index 0000000000000000000000000000000000000000..6c5ad1404e9efeed995a7de4eb7c4a52d76d0162 --- /dev/null +++ b/man/loessGui.Rd @@ -0,0 +1,52 @@ +% Generated by roxygen2 (4.1.1): do not edit by hand +% Please edit documentation in R/loessGui.R +\name{loessGui} +\alias{loessGui} +\title{Loess regression GUI} +\usage{ +loessGui(x, y, data, er = 0.05) +} +\arguments{ +\item{x,y}{independent and dependent (numeric) regression variables.} + +\item{data}{an optional \code{data.frame}.} + +\item{er}{stands for extend range. It is used to extend the plotting +range by a fraction on both sides and directions. Default is +0.05. See \link[grDevices]{extendrange}.} +} +\value{ +None is returned by the function, only a GUI is opened. +} +\description{ +This function opens an interface to control the settings +of a loess regression: +\itemize{ + \item degree choose the local polynomial degree with a radio +selector; + \item span set the span value that controls the degree of +smoothing; + \item center move the x value to be predicted; +} + +The elements of the interface change a plot that shows the observed +values and the corresponding fitted curve superimposed with +confidence bands (for the fitted values). It assumes that +\code{gWidgets} and \code{gWidgetstcltk} packages are available. +} +\examples{ +\donttest{ + +library(gWidgets) +library(gWidgetstcltk) + +loessGui(x=area, y=peri, data=rock, er=0.3) +loessGui(x=speed, y=dist, data=cars, er=0.3) +loessGui(x=eruptions, y=waiting, data=faithful, er=0.3) + +} +} +\author{ +Walmes Zeviani, \email{walmes@ufpr.br} +} +