$Date: 2022-09-17 19:17:29 +0000 (Sat, 17 Sep 2022) $ SHOTGROUPS RELEASE VERSIONS at https://cran.r-project.org/ Version 0.8.2 (Sep 17, 2022) * DFdistr - increase simulation to 10 million runs per condition * readDataShotMarker() - fix handling newer files * getMinCircle(), getMinBBox(), Vignette - documentation update on algorithms for bounding volumes * getMinEllipse() - new function to calculate minimum bounding ellipse * groupSpread(), drawGroup(), runGUI() - report / show minimum bounding ellipse Version 0.8.1 (April 10, 2021) * pmvnEll() - implement Kuonen's (1999) saddlepoint approximation for quadratic forms of normal random variables as an alternative to numerical integration * Vignette - fix URLs Version 0.8 (January 19, 2021) * runGUI() - all shiny apps are now dashboards based on package bs4Dash * getMinCirc() - fix for data where chull() returns collinear points thanks: Esme_ from Stack Overflow * readDataSMT() - fix handling newer files * readDataShotMarker() - fix handling newer files Version 0.7.5.2 (November 27, 2020) * compareGroups() - use coin::approximate(nresample=9999) as B=... has been deprecated thanks: Monte Milanuk Version 0.7.5.1 (July 15, 2019) * targets - new NRA target LR - corrections to help file thanks: Monte Milanuk * drawGroup() - add option valueID which adds the calculated values for the bounding box, group size, CEP, etc. to the diagram thanks: Monte Milanuk * qRangeStat() - use package interp instead of akima for bilinear approximation if both p and nPerGroup are missing from DFdistr - add option for bivariate spline approximation of support grid if both p and nPerGroup are missing from DFdistr * getKuchnost() - new function to estimate the Kuchnost measure of group precision Version 0.7.4 (November 01, 2018) * targets, drawTarget() - new NRA targets MR-1, MR-1FC, MR-63, MR-63FC, MR-65, MR-65FC, LRFC * runGUI() - The shiny apps automatically pick up information on distance to target, on measurement units, and on the target face from the data, if this information is available and uniquely defined * readDataShotMarker() - new function to read CSV files as well as backup files exported from the ShotMarker e-target system thanks: Adam MacDonald * readDataSMT() - new function to read CSV files exported from the Silver Mountain e-target system thanks: Monte Milanuk * readDataOT1(), readDataOT2(), readDataMisc() - add options dist.unit and point.unit to define measurement units for distance to target as well as for point coordinates * getRangeStat() - new function to return range statistics for a given group (extreme spread, figure of merit, bounding box diagonal) * range2CEP() - new function to estimate Rayleigh CEP from range statistics * pRangeStat(), qRangeStat(), rRangeStat() - new functions for the approximate cumulative distribution function, quantile function and random deviates of range statistics (extreme spread, figure of merit, bounding box diagonal), given a circular bivariate normal shot distribution * groupLocation(), groupSpread(), analyzeGroup() - change default to bootCI="none" * compareGroups() - remove groups with only 1 shot instead of failing * analyzeGroup(), groupShape(), groupLocation(), groupSpread(), compareGroups(), drawGroup(), drawTarget(), getCEP(), getConvEll(), range2sigma(), getHitProb() - remove defaults for options dstTarget and conversion to make these act as overrides only. The intention is to use information stored in the shot data, if available. If angular size cannot be determined, it is dropped from the output * getMOA(), fromMOA(), getDistance() - remove defaults for options dst and conversion. Return NA if options are missing and angular size cannot be determined Version 0.7.3 (January 18, 2017) * DFlandy01, DFlandy02, DFlandy03, DFlandy04 - new datasets with groups & chronograph readings (905 shots total) from shooting a .22LR rifle at 50m or 50yd thanks: Larry Landercasper & Albert Highe * getXYmat() analyzeGroup(), groupShape(), groupSpread(), compareGroups(), getCEP(), getConfEll(), getHitProb(), drawGroup(), simRingCount() - new option to center groups to mean (0,0) to ignore bias * {d,p,q}rice() - fix bug: recycling for combinations of nu, sigma with signal-to-noise ratio over 24 * dHoyt() - fix bug: revert incorrect definition Version 0.7.2 (September 21, 2016) * pmvnEll() - fix error following renaming of return values in CompQuadForm::farebrother() version 1.4.2 Version 0.7.1 (April 15, 2016) * combineData() - fix bug: revert erroneous merging of all groups * getMOA(), fromMOA(), getDistance(), getHitProb(), drawGroup(), drawTarget(), - add deg (degree) and rad (radian) as valid angular size units Version 0.7 (January 25, 2016) * DESCRIPTION - move packages mvoutlier and energy to Suggests to reduce the number of hard dependencies * DFdistr - new data frame with the distribution of range statistics (extreme spread, figure of merit, bounding box diagonal) and Rayleigh sigma from a Monte Carlo simulation under the assumption of bivariate circular normality. Includes the first four moments and several quantiles of each distribution * range2sigma() - new function that uses given range statistics to estimate Rayleigh sigma under the assumption of a circular bivariate normal shot distribution (based on DFdistr) * efficiency() - new function to estimate the number of required groups for a given number of shots per group and CI level to achieve a desired CI width when measuring a range statistic or estimating Rayleigh sigma, assuming bivariate circular normality. Also estimates achievable CI width for given number of shots per group, number of groups, and CI level (based on DFdistr) * runGUI() - new function that starts one of 4 shiny-based web application frontends for separate elements of the shotGroups functionality runGUI("analyze") runGUI("hitprob") runGUI("angular") runGUI("range") (requires installing shiny) * getCEP() - add Ignani estimate from Ignani (2010) - add RMSE estimate from van Diggelen (2007) - add Valstar estimate from Williams (1997) - vectorize in CEPlevel - getCEP.default(): CorrNormal, Grubbs, Rayleigh, and RMSE estimates work with 1D data (in addition to 2D and 3D) * getHitProb() - vectorize in r - getHitProb.default(): CorrNormal, Grubbs, and Rayleigh estimates work with 1D data (in addition to 2D and 3D) - fix bug: type="CorrNormal" and accuracy=FALSE gave same result as accuracy=TRUE * getRayParam() - now also provides estimates for 3D data (Maxwell-Boltzmann distribution) and 1D data (half normal distribution) * getMaxParam() - removed as getRayParam() now handles 3D data Version 0.6.2 (November 12, 2015) * getCEP() - add Krempasky estimate from Krempasky (2003) * groupSpread() - change y-axis limits to ensure that density estimate and Rayleigh fit are visible everywhere Version 0.6.1 (September 07, 2015) * DESCRIPTION, NAMESPACE - changes to comply with new CRAN policies and R-devel changes * qRice(), rRice() - also use the Marcum Q-function - like pRice() already did. Remove loUp argument in qRice() and rRice() for numerical root finding of cdf * readDataMisc() - read data exported from Taran 1.0 (http://taran.ptosis.ch/taran.html) Version 0.6 (August 25, 2014) * Note that this release breaks backwards compatibility in getCEP(), getMOA(), fromMOA(), getDistance(), getRayParam(), groupSpread() by changing arguments (see below) * Vignette - add section about provided distributions (Rayleigh, Maxwell-Boltzmann, Rice, Hoyt, radial error for offset correlated normal variables) * Throughout - variable names of data sets are now always lower case, irrespective of the original file * targets - add DSU targets a2, b2, b3, b4, b5, b5 precision, 200m precision (so far, without simulated score due to oval shape) * combineData(), compareGroups() - create and use more descriptive group labels * compareGroups() - fix bug: statistical tests for equal variance / distance to center were incorrect - add Rayleigh sigma and MR estimates including CI - add option CEPlevel to determine coverage for CEP and the confidence ellipse - add option CIlevel to determine level for sd and Rayleigh sigma/MR CIs - show confidence ellipse for specified level instead of error ellipse - add grouped boxplot of distances to group center - add grouped dotplot of distances to group center including Rayleigh mean radius with CI * dMaxwell(), pMaxwell(), qMaxwell(), rMaxwell() - density function, cumulative distribution function, quantile function, and random deviates for the Maxwell-Boltzmann distribution (= distribution of radius around true center for an uncorrelated trivariate normal variable with equal variances, re-written in polar coordinates radius, azimuth, and elevation) * dRice(), pRice(), qRice(), rRice() - density function, cumulative distribution function, quantile function, and random deviates for the Rice distribution (= distribution of radius around the origin for an uncorrelated bivariate normal variable with equal variances and offset mean, re-written in polar coordinates radius and angle) * dRayleigh(), pRayleigh(), qRayleigh(), rRayleigh() - density function, cumulative distribution function, quantile function, and random deviates for the Rayleigh distribution (= distribution of radius around true center for an uncorrelated bivariate normal variable with equal variances, re-written in polar coordinates radius and angle) * getCEP() - option level has been renamed to CEPlevel * getCEP(), getHitProb() - Rayleigh estimate respects doRob=TRUE - Rayleigh estimate uses Singh C2 correction factor for sigma estimate because true mean is estimated as well - type="Rayleigh" uses the Rice distribution for 2D data whith accuracy=TRUE - type="Rayleigh" uses the Maxwell-Boltzmann distribution for 3D data and accuracy=FALSE, and qmvnEll() with covariance matrix sigma^2*I for 3D data and accuracy=TRUE * getGrubbsParam() - fix bug: correct recycling when parameters are given as vectors * getMaxParam() - new function to estimate parameter sigma of the Maxwell-Boltzmann distribution as well as the mean and standard deviation of 3D radial error, including parametric chi^2 confidence intervals * getMOA(), fromMOA(), getDistance() - rename option type="milrad" to type="mrad" - add option type="mil" for NATO mil (the unit circle circumference is divided into 6400 mils) * getRayParam() - add option doRob to use robust estimate of center and covariance matrix for parameter estimation - remove option accuracy that is replaced by option mu - new option mu for when the true mean is known. In this case, Singh C1 estimate is used, and chi^2 CI has df=2*N. When the true mean is unknown, Singh C2 estimate is used, and chi^2 CI has df=2*(N-1) * getRiceParam() - new function to estimate parameters nu and sigma of the Rice distribution based on a set of 2D-coordinates, as well as the mean and standard deviation of 2D radial error, including parametric chi^2 confidence interval for sigma * groupSpread() - option level was split into CEPlevel and CIlevel to allow for separately setting the CEP/confidence ellipse coverage and the width of the sd CIs * qHoyt(), qmvnEll() - fix bug: result for lower.tail=FALSE and q=-Inf or q=Inf was incorrect * qHoyt(), rHoyt(), qmvnEll(), rmvnEll() - if no search interval loUp is provided, try a wider interval to search for the quantile * pmvnEll() - convert vectors of length 1 for sigma and e to matrix before checking for symmetry Version 0.5 (July 04, 2014) * compareGroups() - validate input for option CEPtype (needs to be one single type) * getDistance() - new function to get distance from absolute and angular size * getHitProb() - fix bug: type="GrubbsLiu" always returned NA * getMOA(), fromMOA() - now vectorized in all arguments except type * groupShape() - fix bug: don't show outlier-plot with plots=FALSE * pmvnEll() - fix bug: return 0 for r=0 instead of -2 * rHoyt() - fix bug with method="cdf" * rmvnEll() - new function to simulate random radial errors from a multivariate normal distribution around an offset center * simRingCount() - fix bug: theoretical maximum count for targets with maximum value != 10 Version 0.4 (March 03, 2014) * Note that this release breaks backwards compatibility by changing defaults and return values, notably in getCEP() and compareGroups() (see below) * Move package boot from Depends to Imports field of Description file * Import package CompQuadForm to calculate offset circle/ellipse probabilities in pmvnEll() * Vignette - build with knitr, now all diagrams show up - add sections on conversion between absolute size units and angular size measures MOA, SMOA, milliradian; on plotting groups with scaled bullet holes on a target background; on calculating and extrapolating hit probabilities to different distances; on getting a simulated ring count for a given group and target; on CEP literature - add literature references for computational geometry algorithms and for packages used * Throughout - report size in original measurement unit, MOA, SMOA and milliradian - all functions are tested to work with up to at least 100000 points * targets - new list with definitions of a number of circular target types from shooting federations ISSF, DSB, BDS, BDMP * DF300BLKhl - new dataset with groups from shooting a rifle at 100 yd * dHoyt(), pHoyt(), qHoyt(), rHoyt() - density function, cumulative distribution function, quantile function, and random deviates for the Hoyt (Nakagami Q) distribution (= distribution of radius around true center in a correlated bivariate normal variable re-written in polar coordinates radius and angle) * pmnvEll(), qmvnEll() - new function that integrates the multivariate normal distribution over arbitrary (offset) ellipsoids/circles/spheres and returns their probability. pmvnEll() returns the probability, qmvnEll() the quantile * analyzeGroup() - add option bootCI to select the bootstrap CI type * compareGroups() - add option CEPtype to choose the reported CEP estimate - returned list components sdXY and sdXYci are now themselves lists with one component for each group - add measurement unit to axis labels and distance to subtitle - change axis limits to ensure that all elements are fully visible * drawGroup() - new function to draw a group with scaled bullet holes on a target background. Spread indicators ((minimum-area) bounding box, minimum covering circle, confidence ellipse, CEP, etc.) can be selected individually, plot can be in any absolute or angular size unit, simulated ring value of each shot can be shown * drawTarget() - new function to draw a target pattern given a target definition like those in list targets * getCEP() - fix bug in Grubbs-Patnaik estimate with accuracy=TRUE - report spherical error probable (SEP) when data with tree coordinates is used as input - add estimate based on exact (offset) correlated bivariate normal distribution - add Grubbs-Pearson estimate based on the Pearson three-moment central chi^2 approximation - add Grubbs-Liu estimate based on the Liu-Tang-Zhang four-moment non-central chi^2 approximation - add Ethridge estimate - rename existing type Grubbs to GrubbsPatnaik - add option level to set % coverage for the CEP - add option robust to use the robust MCD estimate of the covariance matrix and center for CEP estimation - only return CEP value for the chosen coverage - change default to the correlated bivariate normal estimate - remove RAND-234 CEP estimate for levels other than 0.5 * getConfEll() - return the confidence ellipsoid when three-dimensional data is used as input * getHitProb() - new function to estimate the expected fraction of shots to have at most a given distance to the group center. Based on the correlated bivariate normal, Grubbs chi^2, or Rayleigh distribution * getHoytParam() - new function to return the shape and scale parameter of the Hoyt distribution based on a set of (x,y)-coordinates * getMOA(), fromMOA() - add option type to select which angular measure to report: MOA, SMOA, or milliradian - deal with missing values in input * getMaxPairDist() - much faster for large numbers of 2D-points * getRayParam() - remove option type as Rayleigh and Gauss estimates end up the same * getXYmat() - now recognizes variables Point.Z, Z, Aim.Z for three-dimensional data * groupLocation() - fix bug where bootstrap BCa CI of the center x coordinate is actually that of the y-coordinate - fix error for >= 1500 points from bootstrap BCa CI - add option bootCI to select the bootstrap CI type - remove options target and caliber for drawing on a background target as this functionality has been moved to drawGroup() - add measurement unit to axis labels and distance to subtitle - change axis limits to ensure that all elements are fully visible * groupShape() - fix bug where histogram of y-coordinates would be overdrawn by the chi^2 QQ-plot when outside of RStudio - fix error for input with > 5000 points by then replacing the Shapiro-Wilk-Test with the plug-in Kolmogorov-Smirnov-Test - add options conversion and distance to be able to report measurement unit and distance to target in plots - change axis limits to ensure that all elements are fully visible * groupSpread() - fix error for >= 1500 points from bootstrap BCa CI - add option bootCI to select the bootstrap CI type - change default CEP type to exact correlated bivariate normal - remove option sigmaType as Rayleigh and Gauss estimates are the same - add measurement unit to axis labels and distance to subtitle - change axis limits to ensure that all elements are fully visible * readDataMisc() - now works with comma-separated-values (csv) files - now works with files defining three-dimensional data using variables Point.Z, Z, Aim.Z * readDataOT2() - now works with files exported from OnTarget TDS 3.8* which have an added column with velocity data * simRingCount() - new function to calculate a simulated ring count given a group of bullet holes, the bullet diameter and a target definition * DFcm - correct measurements for Series 4-9 to correspond to DFinch Version 0.3 (January 08, 2013) * Note that this release breaks backwards compatibility by renaming a few returned list components, changing default values, adding and and removing a few options, and changing return values (see below) * Add package vignette: see vignette("shotGroups") * DF300BLK, DFcciHV, DFscar17 - new datasets with groups from shooting different rifles at 100 yd * analyzeGroup() - if no point of aim is given: warn and assume (0,0) - if no distance to target is given: warn and assume 100 - add option CEPtype to select which CEP estimate to report - coordinates of points of impact can be named either X, Y or Point.X, Point.Y * combineData() - if no point of aim is given: warn and assume (0,0) - warn if no distance to target is given - if no Group is given: warn and assume 1 - coordinates of points of impact can be named either X, Y or Point.X, Point.Y * compareGroups() - if no point of aim is given: warn and assume (0,0) - if no distance to target is given: warn and assume 100 - coordinates of points of impact can be named either X, Y or Point.X, Point.Y - report parametric chi^2 confidence intervals for standard deviations of x and y - report figure of merit and length of the diagonal of the minimum-area bounding box instead of its width and height - report Rayleigh 50% CEP estimate instead of modified RAND-234 estimate - fix bug where distance to center would be incorrectly calculated for data with scrambled Group variable * drawBox(), drawBox2(), drawCircle(), drawEllipse() - make generic with methods to also accept objects returned by getBoundingBox(), getMinBBox(), getMinCircle(), getConfEll(), respectively * getBoundingBox(), getMinBBox() - report figure of merit (average side length of the box) and length of the diagonal * getCEP() - better calculation of Rayleigh and RAND estimator - add Grubbs-Patnaik estimator - add option accuracy to take into account systematic location (accuracy) bias - by default, bias is ignored as before - add option type to select which estimate to report - also return group center * getConfEll() - also return (robust) group center and (robust) covariance matrix with its trace and determinant * getMOA() - units for distance to target and for coordinates can be a mixture of imperial (yd, ft, in) and metric units (m, cm, mm) * getRayParam() - new function to estimate radial precision parameter sigma of the Rayleigh distribution together with its standard deviation RSD and mean MR including confidence intervals * groupLocation() - for bootstrap-CIs of center, sample (x,y)-coords simultaneously instead of bootstrapping x, y separately - report parametric CIs and bootstrap CIs for center x, y in the same list components, respectively, with new names ctrXci, ctrYci - remove option unit as it can be inferred from option conversion - option caliber now needs to be given in mm - add option level to select CI level - values for option target are now called "BDS25m" and "DSB25m" - bugfix for plotting a target with imperial measurement units * groupShape() - add option outlier to select which outlier identification method to use - outlier='mcd' is as before, 'pca' uses the robust principal components analysis from mvoutlier::pcout() * groupSpread() - report parametric and bootstrap confidence intervals for (x,y) standard deviations in separate list components, and add MOA - report empirical median as well as mean distance to center, add option to report either Rayleigh or Gauss estimates for precision parameter sigma, radial standard deviation RSD, and mean radius MR - report parametric and bootstrap confidence intervals for sigma, RSD, MR - report width, height, figure of merit and diagonal for (minimum) bounding box - add option CEPtype to select which CEP estimate to report - add Rayleigh fit to histogram of distances to group center * groupLocation(), groupShape(), groupSpread(), getBoundingBox(), getCEP(), getConfEll(), getDistToCtr(), getMaxPairDist(), getMinBBox(), getMinCircle() - make generic with methods to also accept a data frame either with variables Point.X, Point.Y or X, Y * fromMOA() - bugfix increasing numerical precision for large sizes * readData*() - default is now combine=TRUE * readDataMisc() - coordinates of points of impact can be named either X, Y or Point.X, Point.Y - all variables besides coordinates of points are now optional - default values for other variables will be used with a warning * DFlistInch, DFlistSavage, DFlistTalon - remove lists of data frames as they serve no purpose beyond DFlistCm * Documentation improvements Version 0.2-2 (December 05, 2013) * Remove modeltools, KernSmooth from Depends field (boot is not moved to Imports because package energy depends on boot) * getMinCircle() - fix bug where minimal circle is not identified correctly if it only touches the convex hull in two points thanks: Karl Schilling * getDevice() - since RStudio keeps past diagrams, open diagrams in the same device instead of opening new windows * compareGroups() - use more sensible colors Version 0.2-1 (May 07, 2012) * Make opening several new plot windows work under RStudio which currently (0.95.265) cannot deal with multiple calls to dev.new() * getXYmat() - new utility function to extract the matrix of (x,y)-coordinates relative to point of aim from a data frame * getMinBBox() - fix bug where orientation angle would sometimes be that of the shorter (not longer) edge, slightly faster implementation Version 0.2 (March 13, 2012) * compareGroups() - better naming of columns in returned matrices to identify original group - return correlation matrices of (x,y)-coordinates (instead of covariance matrices) - fix bug for plotting data from more than 8 groups * groupShape() - return correlation matrix of (x,y)-coordinates - better y-axis limits for histograms - chi^2 Q-Q-plot of (robust Mahalanobis distances)^2: reference line now has intercept 0 and slope 1, sample quantiles are on the y-axis * groupSpread() - don't return correlation matrix of (x,y)-coordinates (only covariance matrix) - option to select the confidence level for the confidence ellipse - return size, aspect ratio and flattening of the confidence ellipse - return modified RAND R-234 estimate for the circular error probable - return parametric 95%-confidence intervals for the standard deviations of x- and y-coordinates * getConfEll() - new function to return measures of a confidence ellipse * getCEP() - new function to return estimates for the circular error probable (CEP) * DFsavage, DFtalon - new datasets with groups a rifle at 100 to 300m thanks: Charles & Paul McMillan * getMinBBox() - more efficient implementation * getMinCircle() - fix bug for cases where minimum enclosing circle is defined by two points * drawEllipse() - fix bug for ellipse sometimes being slightly misoriented * Make functions work when there are only 2 points * Leave out robust estimations with less than 4 points Version 0.1 (March 07, 2012) * Initial release