Change Log

The following is a list of changes from the previous version of GAUSS.


  1. New function: dropunusedcategories() removes any categories from the meta data of a dataframe that are not present in the variable.

  2. Bug fix: dfwider() will now only create columns from categories that are present in the variable, ignoring categories present in meta data, but not in the current sample.

  3. Bug fix: dfwider() would fail with an error if the id_cols control structure member was used in an unnecessary, but correct manner.

  4. Bug fix: dstatmt() would fail with an error if used with the by keyword for a categorical variable that only contained a single category.

  5. Bug fix: dropcategories() would error out if more than one category to drop was passed in.

  6. Bug fix: In a specific case the .$== operator with a dataframe on the left and a string on the right that was shorter than the dataframe element, but identical for all characters it contained, would be reported as equal.


  1. Bug fix: Package manager failed to work after updated Conda requirements on Windows.

  2. Bug fix: The error widget incorrectly handled backslashes in certain cases.


  1. Bug fix: plotAddHbar() and plotAddVbar() would return an error in certain cases if the input was an nx2 matrix and the bar was turned ‘on’ for the last element.

  2. Bug fix: plotScatter() and plotXY() could assign the y-axis label to be the name of the ‘by’ variable in the case that the y-label was not previously set and a formula string with the ‘by’ keyword was used.

  3. Bug fix: h5read() and h5open() now work with one-dimensional HDF5 datasets.


  1. Added capability to exclude parts of the columns variable names from becoming part of a new variable when using the names_pattern_split structure member with dflonger().

  2. Added support for a negative offset with upmat().

  3. Bug fix for some specific cases with wide matrices and a large offset with upmat().


  1. New functions dfLonger() and dfWider() convert between wide and long form panel data.

  2. New ability to compute descriptive statistics on a dataframe for each subset based on a categorical variable with dstatmt() and the by keyword.

  3. New ability to estimate linear models separately for each subset based on a categorical variable with the by keyword and glm() or olsmt().

  4. New function fgls() computes feasible GLS estimation with seven options for estimating the innovation covariance matrix.

  5. New function tabulate() generates and returns two-way tables of frequency.

  6. New function DWstat() computes the Durbin-Watson statistic from residuals.

  7. New function tracem() computes the trace of a matrix.

  8. New function startsWith() returns a binary matrix with a 1 if the element starts with the specified string, otherwise 0.

  9. New convenience function insertcols() allows you to insert one or more new columns into a matrix or dataframe at a specified location.

  10. New function isStructType() checks whether a GAUSS variable is a structure of a specific type.

  11. New function dtSecond() extracts seconds component as numbers from date/time variables.

  12. New function dtMinute() extracts the minutes from date/time variables as a number (00-59).

  13. New function dtHour() extracts the hours from date/time variables as a number with option to use 12-hr or 24-hr clock.

  14. New function dtDayofWeek() extracts the day of the week from date/time variables as a number with option to use Monday (1-7) or Sunday (0-6) start of week.

  15. New function dtDayofMonth() extracts the day of the month from date/time variables as a number (1-31).

  16. New function dtDayofYear() extracts the day of the year from date/time variables as a number (1-366).

  17. New function dtDayName() extracts the name of the day of week from date/time variables as a string array with option to use full or abbreviated names.

  18. New function dtMonthName() extracts the name of the month from date/time variables as a string array with option to use full or abbreviated names.

  19. New function dtWeek() extracts the week of the year from date/time variables as a number, using Monday as start of the week (1-53).

  20. New function dtMonth() extracts the month from date/time variables as a number.

  21. New function dtQuarter() extracts the quarter from date/time variables as number (1-4).

  22. New function dtYear() extracts the year from date/time variables as a number with century included.

  23. New convenience function getCategories() returns category labels of categorical variable.

  24. New convenience function dropCategories() removes a category from a dataframe and from the dataframe metadata.

  25. New convenience function isstring() returns a 1 if the input is a string or string array, otherwise 0.

  26. New methods forward-fill and backward-fill added to impute().

  27. Expanded functionality of frequency() to allow for two-way tables and improved printing.

  28. Expanded functionality of strindx(). The second input can now have multiple rows and/or columns as long as it is element-by-element conformable with the first input.

  29. upmat() now has the option to specify an offset from the main diagonal, the option to return only the upper triangular elements as a vector and is faster for medium and large matrices.

  30. New ability to turn density plots off for kernelDensity() procedure.

  31. New option to plot category counts in order from most frequently occurring to least frequently occurring for plotFreq() procedure.

  32. New option to report category counts in order from most frequently occurring to least frequently occurring for frequency() procedure.

  33. plotAddTSHF() no longer requires a frequency impute which simplifies usage.

  34. Speed increase for packr() with large column vectors.

  35. Speed increase for combinate() with large values of n.

  36. Bug Fix: sprintf() could cause a crash in certain cases with very large floating point numbers.

  37. Bug Fix: svdusv() could have a memory leak in certain situations.

  38. Bug Fix: Loading data with loadd() from a .gdat file with certain formula strings would fail with an “arguments not conformable error”.

  39. Bug Fix: Copy-and-paste with the error widget open could cause a crash on Windows 11.

  40. Bug Fix: strindx() could crash if a dataframe with a missing value was passed in as the first input.

  41. Bug Fix: plotsave() could hang if the unit argument was not passed in. The unit argument now has a default value of “px”.


  1. Bug Fix: loadd() could fail to load a csv file if some particular sections ended with multiple missing values.

  2. Bug Fix: loadd() would fail to load .gdat files if a formula string transformed a numeric variable to categorical or string.

  3. Bug Fix: saved() would report an error if saving a dataset with only numeric variables.

  4. Bug Fix: kerneldensity() would not respect x-label setting if a plot setting procedure pointer was passed in and was setting plot canvas size automatically.


  1. Bug Fix: The generated code in the symbol editor could be incorrect in the event a header was both renamed and toggled in a manner that would remove it.

  2. Bug Fix: The generated code in the file import dialog could be incorrect when a certain number of headers were toggled and additional modifications were present.

  3. Bug Fix: rescale() was not always retaining column metadata.

  4. Bug Fix: Matrix multiply operations will now always drop column metadata.

  5. Bug Fix: Custom fonts were being ignored when used in LaTeX labels for \\{text} tags when plotting.

  6. Bug Fix: Specifying "vcenter" in plotSetLegend() was also causing horizontal alignment to occur.

  7. Bug Fix: plotSave() now allows a 1x1 string array for the filename argument instead of requiring a string.

  8. Bug Fix: Additional validation was added to trimr().

  9. Bug Fix: asdf() now allows the headers argument to be a string array instead of requiring each header as a separate string argument.


  1. Behavior Change: The kernelDensity procedure accepts column vector bandwidth to set different bandwidths for each column of the dataset.

  2. Bug Fix: The column sniffing behavior of the import dialog did not match the logic of loadd(), which could lead to unexpected column types.

  3. Bug Fix: Overriding the guessed column type in the import dialog will now correctly use the pass keyword in the formula string, indicating the column should be passed through unaltered.

  4. Bug Fix: The Help Page ‘Index’ widget will now correctly load certain built-in functions that may have redundant pages elsewhere (e.g. the User Guide).

  5. Bug Fix: Selecting a compiled file (extension .gcg) in the project view widget will now execute the file instead of attempting to open it as a source file.

  6. Bug Fix: (Windows) Reading Excel data from COM using xlsReadSA() will now store the data sequentially in the underlying datastore. This was causing corrupted string arrays in certain use-cases, such as overwriting a string value in the symbol. This bug is not present if #define USECOMEXCEL 1 is commented out in xls.src.


  1. strsect() now supports string arrays.

  2. Behavior Change: Date patterns have had their acceptable years modified to 1800 <=> 2200 to reduce the occurrence of false positives. (e.g. detecting a date column with loadd())

  3. Bug Fix: Automatic type detection could cause loading failure in cases where the column looks like a date but is a pre-defined category column.

  4. Bug Fix: In specific cases where a message exceeded a certain size with errorlog, a crash could occur on Windows.

  5. Bug Fix: The fred_api_key value was not being read from the gauss.cfg file.

  6. Bug Fix: Calling strtof() on a dataframe category/string column with a NaN could cause a crash.

  7. Bug Fix: loadd() will now default to the CSV file type for unrecognized file extensions.


  1. A new *.gdat file type has been introduced with full support for GAUSS dataframes. See loadd() and saved().

  2. Added new functions to download and search Federal Reserve Economic Data (FRED) directly into a dataframe. See fred_load() and fred_search().

  3. Added new function to download DBnomics data directly into a dataframe. See dbnomics_series().

  4. Added new function between() returns a vector with a 1 if the element is in the range or otherwise a zero.

  5. Added new function where() that returns elements from a or b, depending on condition.

  6. Added new function shiftc() shifts data down the columns of a matrix.

  7. Added new function kerneldensity() for computing and plotting kernel estimates. Added kernels include Normal, Epanechnikov, Biweight, Triangular, Rectangular, Truncate normal, Parzen, Cosine, Triweight, Tricube, Logistic, Sigmoid, and Silverman.

  8. Added new function kurtosis() to compute sample kurtosis.

  9. Added new function skewness() to compute sample skew.

  10. Added new function jarqueBera() to compute Jarque-Bera test for goodness of fit and normality.

  11. quantileFit() now implements kernel estimate of asymptotic covariance. Kernel options include Normal (Gaussian), Epanechnikov, Biweight, Parzen, and Cosine.

  12. quantileFit() now implements bandwidth selection methods. Method options include Hall-Sheather, Bofinger, and Chamberlain.

  13. quantileFit() now computes pseudo R-squared.

  14. quantileFit() output printing improved and expanded to include model characteristics in model header.

  15. quantileFit() now compatible with dataframe and formula string syntax.

  16. clusterSE() and robustSE() now compatible with dataframe and formula string notation.

  17. clusterSE() and robustSE() now include optional argument for turning off small sample correction.

  18. loadd() can now read known file types directly from a URL.

  19. loadd() will now automatically detect column types. This can be controlled in gauss.cfg with the policy_formula_auto_infer option.

  20. saved() now supports *.fmt files.

  21. getGAUSSHome() can now accept relative paths as an input so they do not have to be appended to the end with the string addition operator.

  22. strctoposix() will now return a missing if the string input matches the current workspace’s missing value.

  23. vartypef() now returns all possible dataframe header types instead of strictly numeric/string.

  24. Up to 10x speed improvememnt and 50% decrease in memory usage for lagn().

  25. lagn() now retains variable names and column types from the input.

  26. Improved performance of date format pattern matching with loadd().

  27. Improved performance of indsav() with dataframes.

  28. Improved performance for reading large XLS/XLSX files with loadd() and when previewing files in the file import dialog.

  29. Improved performance when viewing large symbols in the symbol editor. Specifically symbols with many columns.

  30. Improved performance of all GAUSS ExE operators with temporary matrices (e.g. df[., "age"] .> 30).

  31. Improved performance of reclassify(), especially with a single from and to element.

  32. Opening ReadStat file types (SAS, Stata, SPSS) now has a progress indicator while loading in the file import dialog.

  33. Behavior Change: Unmapped dataframe string/category column values will be represented as string literals instead of a missing for purposes of printing. Note that the string literal will not match a mapped value in an oppossing dataframe in the context of an outerjoin().

  34. Behavior Change: Negative keys are now allowed for dataframe string/category column types.

  35. Behavior Change: The OMP default child count was changed from 2 to 1. This improved performance significantly in cases with threadfor, threadendfor loops that performed multi-threaded BLAS/LAPACK functions, such as matrix multiply.

  36. Bug Fix: A file buffer containing open f = / would cause a crash in the syntax parser.

  37. Bug Fix: An empty newline at the end of a CSV could show up as row of missings.

  38. Bug Fix: Certain edge cases with relative paths could cause #include to fail.

  39. Bug Fix: Certain edge cases in selif(), delif(), copymetadata() and setcoldateformats() caused a memory leak.

  40. Bug Fix: move() could fail in specific cases.

  41. Bug Fix: asdf() now allows dataframes to be passed as input for string arguments.

  42. Bug Fix: Indexing a dataframe with fixed rows and specifying . for the columns when the column count is 1 would not return a dataframe.

  43. Bug Fix: xlsGetSheetSize() would return \([1, 1]\) for sheets that were a row or column vector.

  44. Bug Fix: strctoposix() is now case-insensitive for character literals in the pattern/input.

  45. Bug Fix: Formula strings containing newlines would not work correctly.

  46. macOS now bundles in OpenSSL with the installer, and all three platforms are now using OpenSSL 1.1.1q.

  47. New examples: olsmt_nw.e, kerneldensity_wine.e, quantilefitdf.e


  1. Bug Fix: Extra spacing could show up between axis labels and numbers in certain cases.

  2. Bug Fix: A one-time crash could occur after retrieving an updated license after a subscription renewal.


  1. Added support for GAUSS subscription-based licenses.

  2. Added support for multiple activation keys in the license activation dialog. (GUI)

  3. Added support for passing extra arguments to the objective function in sqpSolve().

  4. Added support for passing extra arguments to the objective function in QNewton().

  5. Bug Fix: dbGetTables() returned an error instead of a scalar missing on an empty result set.

  6. Bug Fix: F4 shortcut was not interpreting __FILE_DIR() correctly.

  7. Bug Fix: Fixed Forward/Back key shortcuts for navigating file history on macOS.

  8. Bug Fix: Custom missing values in the file import dialog could cause GAUSS to crash.

  9. Bug Fix: Allowed changing case of dataframe header names in the symbol editor (GUI).

  10. Bug Fix: Legend positioning could be slightly off in certain circumstances.

  11. Bug Fix: The legend font color could overwrite the marker border color when a plotAdd occurred.

  12. Bug Fix: Use current encoding when doing token matching in the editor.

  13. Bug Fix: macOS update was not removing existing before replacement.

  14. Bug Fix: Multi-element assignment with a 1x1 matrix on the right-hand side would cause an error.

  15. Bug Fix: Indexing a scalar from a dataframe vector in a non-atomic fashion was not returning a dataframe.

  16. Bug Fix: Selecting a new date format in the symbol editor would show existing dates that were missing values as the incorrect date until the change was applied.

  17. Bug Fix: Fixed support for negative category keys when reading Stata files.


  1. New function dfappend() vertically stacks dataframes and merges the meta data from string and categorical columns.

  2. sortc() can now accept multiple columns to sort on. sortmc() can now accept string variable names.

  3. New convenience feature: The column input to reshape() is now optional and if a -1 is passed in for the row or column input, reshape() will infer the other dimension.

  4. New convenience feature: miss() with no inputs will return a scalar missing value.

  5. New functions head() and tail() allow convenient previewing of the first or last rows of data.

  6. New function annotationsettextalign() allows specifying alignment of text inside textboxes programmatically.

  7. New function annotationsetlinepen() allows for more convenient setting of annotation line width, color and style.

  8. Final inputs to annotationsetfont() are now optional inputs.

  9. New function plotsetfonts() allows convenient control of font family, size and color for all, or a subset of the text elements in a graph.

  10. New function plotsetmissgap() controls whether a gap in line plots is shown for missing observations.

  11. New functions plotsetactivex() and plotsetactivey() control which x and y axes (bottom/top, left/right) subsequent plotSet functions apply to.

  12. The legend text item will no longer cyle, meaning it will only be used for the series it was set for.

  13. Added support for specifying textbox position relative to the coordinate location in plotaddtextbox().

  14. Added support for specifying a single x or y-axis to plotsettextinterpreter().

  15. Added support for space separated string specifiers to plotsettextinterpreter() for convenience.

  16. Added additional optional inputs to plotsetxrange() and plotsetyrange() to set the tick inverval and the location of the first tick label.

  17. The x-top axis now supports time series data.

  18. plotsetxrange() and plotsetyrange() can now set the top / bottom x-axes and left / right y-axes separately.

  19. Legend properties, such as font and background settings as well as location can now be set in a plotAdd call if the legend has not yet been drawn.

  20. Improved the automatic tick spacing for time series plots through plotxy() and plottshf().

  21. plotsetxticcount() and plotsetyticcount() when set to 0, now provide a convenient way to turn off ticks and tick labels.

  22. If line style is set to 0 (off) and then line width and/or color are set, the style will be set to 1 (solid). This allows for enabling lines such as the grid that are disabled by default by specifying only line width or color.

  23. All “base” graph profiles in preferences (e.g. “Bar”, “XY”, “Scatter”, etc) will be overwritten when GAUSS is updated. This allows us to push updates and fixes to the default profiles. Permanent changes and settings should be saved to a cloned profile.

  24. Added additional optional input to functions vcm() and vcx(), allowing control over the degrees-of-freedom adjustment used in the computation.

  25. Added additional argument to outerjoin() to allow a full outer join instead of only left outer join (the default).

  26. Added significant performance increase to indnv() for most cases. If the input is already sorted, indnv() now accepts an optional argument to specify this for reduced overhead.

  27. The main logic of innerjoin() is now an intrinsic instead of a procedure.

  28. Add missing export in gsgraphics_stub shared library for the GAUSS Engine.

  29. Nested for loops with a duplicate counter identifier will now show a more accurate error message when the compile fails.

  30. copymetadata() now allows repeating columns from the source dataframe as well as specifying a subset of columns to apply to the destination dataframe.

  31. Improved layout of graph profile preferences for better viewing compatibility on smaller resolutions.

  32. Bug Fix: plotsetxticinterval() and plotsetyticinterval() would set the top x-axis or right y-axis respectively when a scalar (rather than 2x1) input was passed in.

  33. Bug Fix: Indexing a dataframe in a specific manner resulting in a scalar could sometimes omit the metadata.

  34. Bug Fix: Metadata cache would sometimes not be kept when the LRU cache was full.

  35. Bug Fix: Reading complex (i.e. with imaginary numbers) datasets with readr() in certain cases could return the error “read past end of file”.

  36. Bug Fix: __FILE_DIR() is now fixed when used in the Command window on Windows.

  37. Bug Fix: Manually created libraries were not immediately visible in certain cases. Extra library paths in the GUI are now refreshed on library creation to fix this.

  38. Bug Fix: Regression: Filtering dataframe date columns in the symbol editor now works correctly again.

  39. Bug Fix: Bar plots were incorrectly adjusting their size based on the line thickness, even when the line style was set to none.

  40. Bug Fix: strsplit() could cause a crash in specific cases.

  41. New example files plotunemp.e illustrates plotting time series variables from a dataframe using plotXY() and formula strings, plot_customlayout_1.e shows placing a histogram count of the data above the x-axis and across from the y-axis..

  42. Updated example files to use new functionality: plotadd1.e, plotaddci.e, plot_bootmean.e, plotadderrorbar2.e, plotar2.e, plotbar.e, plotbox_auto.e, and more.


  1. stocv() now supports dataframe inputs.

  2. satocv() now supports dataframe inputs.

  3. strtof() now supports dataframe inputs.

  4. Bug Fix: ftocv() now correctly strips metadata if a dataframe is provided.

  5. Bug Fix: loadd() now correctly works with CSV and XLS files with header_row = 0 for the control struct member.


  1. Graphics: Added support for date variables to plotScatter() and plotXY().

  2. Graphics: Added support for specifying date intervals to plotSetXTicInterval().

  3. Optimized changing the format in the symbol editor for extremely large symbols.

  4. Add warninglog() and warninglogat() keywords to produce warning, similar to errorlog() and errorlogat().

  5. Bug Fix: Context menu actions in the symbol editor were erroneously remapped to copy.

  6. Bug Fix: When changing to a numeric or string/category type in the symbol editor, the generated code would have an incorrect column if ‘Create New Column’ was checked.

  7. Bug Fix: Passing a dataframe date column as a position argument to a plot with a datetime axis was not keeping the position as a date.

  8. Bug Fix: plotSetGrid() had a regression which dropped support for the deprecated method of specifying 0 (off) or 1 (on) with an integer. This has been restored for backward compatibility.


  1. Bug Fix: Specifying the GAUSSHOME value with non platform-specific separators would cause globbing to fail when reading gauss.cfg, (eg $GAUSSHOME/pkgs/*/src on Windows)

  2. Bug Fix: Filtering a date column in the File Import dialog or symbol editor was referencing the wrong column type when generating code. The resulting filtering operation was correct, but has been rectified to generate more friendly code.


  1. Added new preprocessor #includedir to add current file directory to source path. If executed from the Command Window (PGM), uses current working directory.

  2. #include and #includedir statements can now be processed with F4 in the GUI.

  3. __FILE_DIR() now works with F4 in the GUI.

  4. Added new function resetsourcepaths() to restore source path to initial value from gauss.cfg.

  5. Duplicate header prevention was added for dataframes. This can be toggled via policy in gauss.cfg with the policy_check_df_header_dupes key.

  6. Added new function asdf() to allow automatic conversion of scalar/matrix/string/string array to a dataframe. Headers can now be specified as N additional arguments, where N is equal to the column count of the input symbol.

  7. Added new function currentprocname() was added to return the name of the current proc. It also accepts 1 argument to return the name of the calling procedure(s) from previous stack frame(s) if desired.

  8. Added new function isunique() to return a scalar denoting whether all rows in a matrix or dataframe are unique.

  9. Added new function isrowunique() to return a vector denoting whether each row is unique.

  10. Added new function dropduplicates() to return the input matrix/dataframe with all duplicate rows removed.

  11. Added new function getduplicates() to return the input matrix/dataframe with only duplicate rows present. The original row number is prepended as the first column to the output of this function.

  12. setcolnames() now has header duplicate checking and auto-renaming if the policy_check_df_header_dupes policy is enabled in gauss.cfg. This policy is enabled by default.

  13. dfname() was added as an alias for setcolnames().

  14. dftype() was added as an alias for setcoltypes().

  15. asdate() was added as an alias for setcoldateformats().

  16. %e, %E, %f, %F, %g, %G flags were reimplemented for more consistent results with sprintf().

  17. dttostr() will now return a string instead of a 1x1 string array.

  18. Formula strings now support more than one dependent variable. (fields specified before a ~ in a formula string).

  19. Added %v support to asdate(). This is shorthand for %e-%b-%Y.

  20. Added support for the automatic monthly, quarterly, and yearly date-conversions in Stata files (e.g. .dta files).

  21. sprintf() now supports the following base conversion patterns: %b (binary), %o (octal), %x and %X (hex).

  22. aggregate() now accepts an optional input specifying the column index or name of the variable to aggregate on.

  23. Graphics: plotScatter(), plotXY() and plotBox() now support formula strings and automatically handle dataframe input to generate the appropriate axis and legend labels.

  24. Graphics: New formula string keyword, by splits data to be plotted by plotScatter(), plotXY() and plotBox() by a specified categorical or string variable and automatically handle dataframe input to generate the appropriate legend items.

  25. Graphics: Added support for legends to have their own title with plotSetLegendTitle().

  26. Graphics: Added new functions for vertical/horizontal lines to span the entire axis: plotAddVLine(), plotAddHLine().

  27. Graphics: Added new functions for vertical/horizontal bars to span the entire axis: plotAddVBar(), plotAddHBar().

  28. Graphics: plotAddVBar() and plotAddHBar() support FRED-style input data. (eg { 1950, 1 }, { 1951, 1 }, { 1952, 0 }, …).

  29. Graphics: Added support for dates in simple string format to plotSetXRange().

  30. Graphics: Added support for outliers to plotBox().

  31. Graphics: plotBox() can now accept a vector of groups as the first data input. The y variable will be split by the categories in the group vector and plotted as separate boxes.

  32. Graphics: Added new function plotSetJitterRange() to control the jitter range for plotScatter() and plotBox() outliers.

  33. Graphics: Attributes for each axis can be assigned separately. The existing plotSetAxesPen() convenience procedure will still assign attributes to all axes simultaneously.

  34. Graphics: The font can now be specified for plotContour() labels.

  35. Graphics: Axis tics can now be displayed on the inside of the chart (as opposed to outside only) or hidden completely with the plotSetTicPosition() function.

  36. Graphics: Added new function plotSetOutlineEnabled() to allow a box outline around the entire chart. Outline attributes are controlled via axis properties using plotSetAxesPen() or individually with plotSetXPen() and plotSetYPen().

  37. Graphics: Axes are now at a higher Z-order than series, so lines will not render on top of the axes lines.

  38. plotSetAxesPen() has a new optional input to set the axes line style.

  39. Graphics: New functions plotSetXGridPen() and plotSetYGridPen() allow the major and minor x and y axis grid lines to be enabled and styled separately.

  40. Graphics: New function plotSetGridPen() allows the major and minor x and y axis grid lines to be enabled and styled.

  41. Graphics: Graph profile settings in the preferences dialog have been fully refactored to only show properties related to the selected graph category. This should reduce confusion regarding which properties are respected when plotting a graph of the specified type.

  42. Graphics: Added support for specifying the bar width (plotSetBarWidth()) and box width (plotSetBoxWidth()).

  43. Graphics: plotAddXY() and plotAddScatter() now support category labels as input for X values, so data can be added to locations specified by a text label, rather than a numeric value.

  44. Graphics: Contour is now a new default graph profile instead of being shared with Surface.

  45. Graphics: New convenience function plotSetLinePen() to set the line width, color and style in one call.

  46. Graphics: New function plotCloseAll() closes all open graphs.

  47. Graphics: Performance: support was improved for plotting large numbers of points for XY and scatter series.

  48. Graphics: Behavior change: the default line thickness for bar plots has been set to zero to be consistent with commonly desired styling for added spanning bars.

  49. Graphics: Behavior change: the legend position can be updated with settings from a plotAdd call if no legend items already exist on the graph.

  50. Graphics: Bug Fix: Outside middle legend will now always have a vertical orientation.

  51. Graphics: Bug Fix: plotOpenWindow() now retains focus in the widget prior to the call (eg the PGM).

  52. Graphics: Bug Fix: plotAddBarH() would calculate the X offset incorrectly if the input X values were index values instead of labels.

  53. Graphics: Bug Fix: Axis properties for plotPolar() was applying the settings in a reversed manner. X-Axis settings now represent the azimuth with Y-Axis settings representing the radial axis. The input order for plotPolar() has not changed.

  54. Graphics: Bug Fix: plotTSHF() would not allow a fixed axis range to be specified.

  55. Graphics: Bug Fix: plotTSHF() would sometimes omit axis labels in the case of too few calculated labels. At least 1 will be rendered now.

  56. Performance: movingave() up to 4-6x faster.

  57. Performance: unique() was optimized and should be faster.

  58. For convenience you can now assign a scalar value to multiple elements of a matrix or dataframe (eg x[1 3 5,2] = 7.3;).

  59. Dataframes: All dataframe functions (dfname(), dftype(), asdate(), etc) can now automatically convert a non-dataframe input to a dataframe. String arrays are automatically converted to a category column.

  60. Dataframes: asdate() now allows omission of the format argument, and will default to %Y-%m-%d %H:%M:%S.%L. All or part of this format can be specified in the input argument.

  61. Dataframes: passing a format of %s to asdate() will automatically coerce it to a friendly format.

  62. Dataframes: Behavior: Overwriting an entire column during an assign will overwrite the LHS metadata if the RHS is also a dataframe.

  63. Dataframes: Behavior: Combining dataframes with string arrays using the string combine operator, $+ is now supported.

  64. Dataframes: Multiple new functions now support dataframes as input arguments: strtrim(), strtriml(), strtrimr(), strtrunc(), strtruncl(), strtruncr(), strtruncpad(), upper(), lower(), strindx(), strreplace(), strsect(), indsav(), indnv(), contains(), strsplit(), strjoin(), strcombine(), aggregate()

  65. Dataframes: A low-level function normalizecollabels() was added to automatically refactor string/category columns to remove duplicates and consolidate keys.

  66. Dataframes: Added string/string array assignment support to existing string/category columns.

  67. Dataframes: Date pattern matching has been relaxed. If a string fully matches a date format pattern completely, the calculated date up until that point is now returned instead of requiring the entire format to be satisfied. Most functions that take a date format pattern now default to allowing full/partial usage of the pattern "%Y-%m-%d %H:%M:%S.%L".

  68. Dataframes: strctoposix() now returns a dataframe.

  69. Dataframes: Symbols viewed in the symbol editor will now show up as a ‘Dataframe’ in the type field instead of ‘Matrix’.

  70. Dataframes: Improved behavior when checking for like-column types in a partial row assignment from one dataframe to another.

  71. Dataframes: outerjoin() (left outer join) has been rewritten completely as an intrinsic with full support for dataframes with a significant performance increase.

  72. Dataframes: Generated code in the file import dialog now takes advantage of new dataframe behavior to allow more concise code.

  73. Dataframes: Specifying custom col labels for string/category columns now uses a seqa() representation for the values if they are left as their default. (Optimization)

  74. Dataframes: sortc() now allows you to specify columns by name.

  75. Dataframes: Empty date formats now default to the default date format of %Y-%m-%d.

  76. Dataframes: Any function converting a symbol to a string/category will now sort the labels before generating the keys.

  77. Dataframes: Bug Fix: Unsorted indices passed to dataframe functions could cause changes to be incorrectly applied.

  78. Dataframes: Bug Fix: Specific cases where a program errored out could potentially remove metadata from a symbol in the workspace.

  79. Dataframes: Bug Fix: Metadata was not being applied correctly in specific struct-index assignment cases.

  80. Dataframes: Bug Fix: String/Category columns can now be used with the %s pattern in sprintf().

  81. Dataframes: Bug Fix: All dataframe and string combinations are now supported for $+ operations.

  82. Behavior Change: aggregate() will now check for and ignore missing values by default. An optional input flag has been added to not check for missing values as in the previous version.

  83. Behavior Change: Code generation for dataframe operations in the symbol editor have been optimized to be as concise as possible.

  84. Behavior Change: Columns in the symbol editor will attempt to automatically resize to yield a more user-friendly display.

  85. Behavior Change: Multiple equality filters of the same type in the dataframe ‘Filter’ tab are now grouped together to use rowcontains() for optimized code generation and performance.

  86. Behavior Change: Policy policy_scalar_df_indexing is now enabled by default. This policy was added in 21.0.6 to control behavior for dataframe indexing operations that return a scalar. Resulting scalar will now remain a dataframe by default.

  87. Bug Fix: setcollabels() incorrectly allowed the indices argument to be omitted. This has been fixed, but improved to allow omission of the indices argument if the input argument only has one column. The values used will be [0…N-1] where N is the number of labels.

  88. Bug Fix: move() now makes a copy if the input symbol can’t release ownership.

  89. Bug Fix: Use system palette when restoring regular font color in textbox of editor/PGM find widgets.

  90. Bug Fix: Custom missing values set with msym() was incorrectly printing the missing value backwards in sprintf().

  91. Bug Fix: selif() could return a partial dataframe if the return value was a scalar missing.

  92. Bug Fix: If a tab character was the delimiter in the file import dialog, the generated code would include a literal tab character as a string. This has been fixed to escape the tab character in the string (eg ctl.delimiter = "\t").

  93. Bug Fix: seqadt() and seqaposix() now correctly allow dataframes to pass through without losing their metadata.

  94. Bug Fix: Formula strings that contained a : or * character in the argument field (eg date($my_date, '%Y-%m %H:%M')) were being treated as multiplier operations.

  95. Bug Fix: Add date cell editing support in the symbol editor.

  96. Bug Fix: In the import dialog, generated code was not updating when a custom category label or date format was specified. This bug was visual only, as the correct code was generated when the Import button was pressed.

  97. Bug Fix: In the import dialog, the input box for the new column name was not noticeably greyed out on macOS when the widget was disabled.

  98. Bug Fix: The symbol editor will no longer automatically open the ‘Manage’ panel for dataframes.

  99. Bug Fix: setcolnames() was incorrectly allowing empty names as input.

  100. Bug Fix: A missing/NaN in a string/category column will now display the correct value when printed, instead of an empty string.


  1. Bug Fix: plotContour() would render incorrectly if a custom X/Y range was specified.


  1. Bug Fix: strctodt() and strctoposix() would set the finalized date to 1 day prior if the day was not specified in the string.

  2. Bug Fix: Deleting a dataframe from the data page while also having the dataframe open in the symbol editor would cause a crash.

  3. Bug Fix: Non UTF-8 encoded dataframe category string values could sometimes display incorrectly in the symbol editor.

  4. Bug Fix: Autcomplete could trigger in comments or strings if the cursor was at the very end of the file.

  5. Bug Fix: The autocomplete popup could show up in the Program Input/Output window (PGM) at inconvenient times, such as input during a cons() call.

  6. Bug Fix: When a specific operator prefixes a symbol, hovering while debugging or trying to watch the symbol with Ctrl+E would retain a leading period character.

  7. Bug Fix: timediffdt() and timediffposix() were incorrectly returning output as a dataframe.

  8. Bug Fix: aggregate() now correctly returns result as a dataframe.

  9. Bug Fix: An empty date format string was allowed in setcoldateformats(). Now uses default date format in that case.


  1. Added policy to control behavior for dataframe indexing operations that return a scalar. Resulting scalar can now remain a dataframe.

  2. Added dataframe category/string support to indexcat(), rowcontains(), ismember().

  3. Windows: Added MySQL/MariaDB SQL driver.

  4. Bug Fix: Printing a dataframe now correctly prints a newline before the headers.

  5. Bug Fix: Indexing a data frame with a string array could cause a crash in certain cases.

  6. Bug Fix: Specific edge cases could cause incorrect metadata to be applied in indexing operations. Numerical results were not affected.

  7. Bug Fix: strlen() now correctly works with dataframe category/date columns.

  8. Bug Fix: Memory leak in seqaposix() and seqadt() for certain cases.

  9. Bug Fix: Memory leak in eye() for certain cases.

  10. Bug Fix: Dataframe comparisons against a string array operand could crash.


  1. Add new plotAddXYFill() function.

  2. Update OpenSSL libraries on Linux to 1.1.1j.


  1. Bug Fix: Fixed edge-case performance issue.


  1. Bug Fix: dbGetTables() would crash GAUSS.

  2. Bug Fix: eye() would crash in specific circumstances if a value less than 1 was passed in.


  1. Bug Fix: sprintf() had incorrect output in the %g case with 0’s after a decimal and prior to the first significant digit.


  1. Editor documents now have yellow underline markup for locals and/or arguments that are unused, as well as an icon in the margin.

  2. Bug fix: corrxs() was not correctly copying metadata upon return.


  1. GAUSS now supports dataframes with date, categorical, string and numeric columns.

  2. loadd() now returns a dataframe. This is a behavior change that can be reverted by the #defines in policy.dec.

  3. loadd() now accepts an optional input with support for additional data loading options, such as selecting a row range, specifying Excel sheets, CSV delimiters, the header row, values to interpret as missing values, and the quote character.

  4. loadFileControlCreate() fills a loadFileControl structure with the defaults for the new data loading options.

  5. Formula string keyword cat now supports an optional input to set the base case.

  6. Formula string keyword date now supports an optional input to specify the incoming date format.

  7. Logical operators (.<, .>, .<=, .>=, .==, .!=) support comparisons with date strings and categorical variable labels.

  8. glm() and olsmt() support dataframes and automatically turn categorical variables in to dummy variables.

  9. dstatmt() supports dataframes and counts missing values by default.

  10. saved() will write, string, categorical and date variables. The variable names argument is now optional.

  11. New functions setcolnames() and getcolnames() set and return columns names of a matrix, or dataframe.

  12. New functions setcoltypes() and getcoltypes() set and return the variable types of the columns of a matrix, or dataframe.

  13. New function setcolmetadata() sets column names and variable types for a matrix or dataframe.

  14. New function recodecatlabels() changes the labels displayed for a categorical variable in a dataframe.

  15. New function reordercatlabels() changes the order of the labels displayed for a categorical variable in a dataframe.

  16. New function setbasecat() sets the base category of a categorical variable.

  17. New functions setcollabels() and getcollabels() set and return the integer key values and string labels of categorical variables in a dataframe.

  18. New function getcollabelvalues() returns the string labels for every observation of a categorical variable as a string array.

  19. New function setcoldateformats() sets the display format of a date variable, getcoldateformats() returns the display format.

  20. New function hasmetadata() returns a 1 if the input is a dataframe.

  21. New function asmatrix() turns a dataframe into the equivalent matrix.

  22. New function order() reorders columns of a dataframe by name.

  23. New function frequency() computes a frequency table for a categorical variable.

  24. The Data Import Window now supports variable selection, interactive filtering and automatic code generation.

  25. The suffix for duplicate headers in the import dialog now start at _2 instead of _1.

  26. Symbol Editors support the same variable selection and filtering options added to the Data Import Window.

  27. Formatting in the Symbol Editor is now on a per column basis.

  28. Character vectors now show up to 8 characters in the Symbol Editor (the length is NOT limited for string arrays or dataframe string and category columns).

  29. CSV sniffing in the Data Import Window will now only occur for the first 200 rows instead of the entire file to improve performance.

  30. The Project Folders window now automatically shows contents of the Current Working Directory.

  31. The Project Folders window now shows new files without need to refresh.

  32. The default setting for the run button is now to run the active file. This can be changed in Preferences to be the same as previous versions.

  33. Find Usages for local variables now reports only instances of the local variable.

  34. CTRL+F1 will now find the declaration of local variables in a procedure.

  35. New Preference option to specify the default directory for File > Open.

  36. Assignments to arrays of structures in threadFor loops is now allowed.

  37. Bug fix: Memory leak in lagtrim().

  38. Bug fix: Memory leak in specific situation with EuropeanBSCall().

  39. Bug fix: threadFor would not allow certain cases with multiple references to a slice variable to compile.

  40. Control Var node on Data Page is now collapsed by default.

  41. New example files for dataframe ‘get’ and ‘set’ functions as well as frequency() and plotFreq().

  42. GLM example files updated to use dataframes.


  1. Bug Fix: sprintf() had incorrect output in the %g case with 0’s after a decimal and prior to the first significant digit. (Backported)


  1. macOS: Add environment variable QT_MAC_WANTS_LAYER to LSEnvironment key to fix hang on startup with Big Sur.


  1. strctoposix() and posixtostrc() now support specifying the quarter (%q).

  2. Add ability to toggle ‘Safe Write’ in preferences. This fixes an issue some users may experience when trying to save files in Dropbox/OneDrive/Google Drive, or other similar shared folders.


  1. Bug Fix: sprintf() was omitting trailing 0’s for %f case.

  2. Bug Fix: A regression caused plotSurface() to segfault on Windows.

  3. Bug Fix: Using cql_stubs.dll with a GAUSS Engine program did not have the correct symbol definitions to be used for deployment.

  4. Bug Fix: Some graphics legend items were not appearing in very specific cases.

  5. Bug Fix: plotLogX() and plotLogY() were incorrectly setting both axes to log scale.

  6. Bug Fix: gmmFit() was not computing Hansen J-stat.

  7. Bug Fix: Some Project View folders did not have ‘Set to Working Directory’ available.

  8. Added optional user-specified truncation lags to gmmFitIV() and gmmFit()

  9. Bug Fix: Updated HAC weight matrix computation method in gmmFit() and gmmFitIV()


  1. Bug Fix: The olsmt() procedure was not correctly implementing specified weights when data inputs included missing values.

  2. Added error log for case of non-compatible covariance specifications with weighted least squares.

  3. Added error log for case of improperly specified weights.

  4. Added error log for case of non-compatible pairwise deletion option with weighted least squares.

  5. Add custom quotation character support to csvReadM() and csvReadSA().

  6. Bug Fix: varget() was not performing a deep copy for structs.

  7. Improve performance for enumeration and tooltips on symbol page for very large strings.

  8. Bug Fix: plotAddBar() and plotAddBarH() could sometimes segfault without a correctly initialized axis.

  9. Bug Fix: plotAddBarH() was not behaving the same as plotAddBar() with existing labels and custom indices.


  1. File import dialog now uses %g formatting by default.

  2. Bug fix: Certain editor codecs were not loading correctly on startup when selected in preferences.

  3. macOS: Build against Qt 5.12.6.

  4. macOS: Upgrade Sparkle to 1.22.

  5. Linux: Add new-version check functionality to Linux.


  1. Added new example files aggregate_housing.e, sprintf_cancer_1.e, sprintf_cancer_2.e.

  2. Bug fix: plotAddHist() could crash if the previous graph did not have a category axis.


  1. New integrated package manager to download, install and uninstall Aptech provided, or private GAUSS packages.

  2. New function, aggregate() to group data by a column containing group ids, using one of several methods such as mean, median, mode, standard deviation, sum, and variance.

  3. New function sprintf() formats combinations of string and numeric matrices.

  4. New function loaddSA() loads variables from datasets as GAUSS string arrays.

  5. New function dynargsGet() retrieves optional arguments passed into a procedure, or default values.

  6. New function dynargsCount() counts the number of optional arguments passed into a procedure.

  7. New function dynargsTypes() returns a vector indicating the types (i.e. matrix, string, structure) of the optional arguments passed into a procedure.

  8. New function modec() computes the mode of the columns of a matrix.

  9. Added option to use custom weights for weighted least squares estimation with olsmt().

  10. New function plotXYFill() creates filled area plots between XY lines.

  11. New function plotBarH() creates horizontal bar plots.

  12. New function plotSetYTicInterval() controls y-axis tick label positioning.

  13. Added ability for plotAddBar() to add bars to specified locations.

  14. plotSetLegend() now allows setting the legend location by axis coordinates as well as text location.

  15. New function plotSetLegendBorder() controls the style properties of the legend border.

  16. All plot colors now support alpha channel, providing the option to add transparency to any graph item.

  17. Added new methods to impute() function: predictive mean matching, local residual draws and linear prediction.

  18. Command reference documentation style updates and new examples.

  19. Speed increase for certain cases of *X'X* with small to medium matrices.

  20. Reading and writing .XLSM files is now supported for the case where the COM/Excel interface is not used.

  21. Increased compatibility for newer style .XLSX files for the case where the COM/Excel interface is not used.

  22. Bug fixes: several minor bug fixes for reading .XLSX files in the case where the COM/Excel interface is not used.

  23. Added count of number of open files to Edit Page to open file dropdown selection widget.

  24. Bug fix: substute() reported error unnecessarily for specific case with mixed numeric and string input.

  25. Bug fix: xlsReadSA() reported error with string array vls input.

  26. Bug fix: reclassify() possible crash when the from variable was much smaller than to.

  27. Changed state variable in example dataset hsng.dat to a string variable with state abbreviations.

  28. New example file wls.e demonstrates weighted least squares estimation.

  29. New example file impute.e demonstrates several missing value imputation methods.

  30. Adding setting dataloop_case = on to gauss.cfg. This setting will instruct the dataloop translator to ignore case in dataloop statements.

  31. Upgrade Reprise License Manager (RLM) to 13.0 for all platforms


  1. Upgrade Reprise License Manager (RLM) to 13.0 for macOS


  1. Add explicit query-deleting for database calls (eg dbExecQuery()) with dbQueryDelete() method.

  2. Database: Add auto-cleanup of queries and open databases on ‘new’ statement and after GAUSS_FreeWorkspace

  3. Bug fix: Fix performance issues with bulk inserts for database operations

  4. Bug fix: A dangling str-concat operation ($+) could result in a crash when using on the command-line

  5. Bug fix: strtof() would result in output matrix twice as large as input even in cases of real input.


  1. Full re-mapping of all key/keyw values to match GAUSS 10 and below values. Lookup table available in key and keyw reference pages.


  1. Update bundled LaTeX library (MathJax 2.7.5)

  2. Bug fix: Formula strings that specified a modifier for a variable now always negate the original variable. eg. ". + ln(x)" will now remove ‘x’ from the output

  3. Bug fix: The saveall command could cause a program to crash after the save in specific situations.


  1. Bug fix: Saving files was improved in situations where the file could be locked, resulting in being unable to save or extra temporary files.


  1. The Program Input/Output window (PGM) now supports autocomplete for active workspace symbols.

  2. The Program Input/Output window (PGM) and all editor documents support autocomplete and lexing for library symbols not part of gauss.lcg.

  3. Struct definitions are now included in the library tool list.

  4. Add more descriptive messaging to gpkg errors when installing packages.

  5. Added function plotSetZRange() to control the range of the Z-axis on surface plots.

  6. New example files plotlogx.e() and plotlogy.e().

  7. Bug fix: quantileFit() errors for case when weights are included and data has missing values.

  8. Bug fix: When viewing a struct member with the symbol editor (e.g Ctrl+E), the member now correctly scrolls into view in the tree.

  9. Bug fix: The ‘Format Text’ functionality in editor documents now keep preprocessor statements fully left-aligned. The ‘keyword’ token now correctly starts an indentation block.

  10. Bug fix: Autocomplete pop-up could freeze in certain situations with too many token references due to memory leak.

  11. Bug fix: Potential freeze when debugging with an undocked graphics page and floating symbol watch.

  12. Bug fix: Specific case of weights with missing values in data when using quantileFit().

  13. Bug fix: Fix ‘Save with Encoding’ option from codec selector dialog.

  14. Bug fix: Add missing context-menu icons for tab split action when a split already exists.

  15. Bug fix: Linux startup script writing empty file named ‘0’ in current working directory.

  16. Bug fix: Proc detection for editor documents in certain cases where proc name or arguments contain underscores.

  17. Bug fix: Accidentally resetting legend orientation in plotSetLegend().

  18. Bug fix: Rare crash when plotting.

  19. Bug fix: Reading files with loadd() could fail to read mixed columns in rare cases.

  20. Bug fix: Legend position now only uses original position on a plotAdd() even if initial plot call had no legend.

  21. Bug fix: Parent graph could have incorrect sizing after a plotAdd() if legend position was outside.


  1. Speed up of approximately 33% to quantileFit().

  2. Improved formatting of output tables for dstat(), dstatmt() and olsmt().

  3. Added ability for plotSetYTicLabel to control the tick label formatting of the right y-axis.

  4. Bug fix: possible crash in certain cases when passing scalar input to invpd().

  5. Bug fix: output table printing returned error when variable names were not specified in quantileFit().

  6. Bug fix: X-tick labels did not start at the first label position specified by plotSetXTicInterval() in certain cases for non-time series data.

  7. New example program plottshf_yellowstone.e shows how to: plot monthly data with plotTSHF(), set labels and format the tick labels for the left and right Y-axes, control the location and frequency of x-axis tick labels, select observations from a matrix based on data and specify the graph size programmatically.

  8. New example programs plotbox_auto.e, and quantilefit3.e.

  9. Bug fix: Allow curve attribute control in graphics page settings widget for box plots with groupingBehavior set to 1.


  1. Update scatter1.e example.

  2. Fix action list ‘Current File’ action.


  1. New online license activation allows for convenient license activation from a product key.

  2. New function quantileFitLoc() performs local linear and quadratic quantile regressions.

  3. New function quantileFit() performs quantile regression.

  4. New function qfitControlCreate() creates default qfitControl structure.

  5. Added option for clustered standard errors and robust standard errors to olsmt() and quantileFit().

  6. New function clusterSE() for computing clustered standard errors.

  7. New function robustSE() for computing heteroscedastic-robust standard errors.

  8. New ‘date’ keyword for formula strings simplifies reading dates from CSV files.

  9. New ‘$’ keyword for formula strings reading and processing string columns.

  10. New function norm() computes the matrix 1, 2 (Spectral), Infinity, Frobenius and Nuclear norms or the vector p-norm.

  11. New function lagTrim() returns a matrix containing specified lags and/or leads with incomplete rows removed.

  12. New function recserVAR() performs efficient simulation of a VAR process.

  13. lagn() can now accept an optional argument to specify the fill value for the missing observations.

  14. saved() can now conveniently create datasets in Excel or CSV format.

  15. plotTS() can now plot daily data.

  16. X-tick locations can now be controlled with plotSetXTicInterval() for XY, Scatter, Contour and Histogram plots.

  17. New function plotTSHF() and plotAddTSHF() creates time series plots for high frequency and irregularly spaced data.

  18. New functions plotTSLog() and plotAddTSLog() create time series plots with the y-axis in log space.

  19. New function plotSetGroupingBehavior() to control whether box plots are drawn as separate boxes or part of a group–which controls color behavior and spacing.

  20. New function plotSetYTicLabel() controls the format and angle of y-axis tick labels.

  21. New function plotSetLegendBkd() controls the opacity and color of the legend background.

  22. Behavior change: The following default graph settings have changed: the grid is off, the axes lines and font text color are now set to black.

  23. Added option for Run and Debug buttons to run the Current File (Tools > Preferences > Command > Behavior).

  24. New function impute() fills in missing data with a choice of imputation methods.

  25. Outer vector product is up to 400% faster, using the * operator.

  26. Matrix inverse with inv() is 20%-400% faster for matrices with sizes around 40x40 to 110x110.

  27. The log 10 and natural log functions, log() and ln(), take 15% to 60% less computation time for matrices and arrays with more than approximately 50 or more elements.

  28. amult() performs matrix multiply with multi-dimensional arrays 20% to 3,500% faster for arrays with approximately 50 or more elements.

  29. exp() is 20% to 800% faster for matrices and arrays with more than approximately 50 or more elements.

  30. dot() is faster.

  31. X'y is faster when X is a matrix and y is a vector.

  32. Matrix multiplication is faster and uses less memory when X is a non-square matrix.

  33. New function dttostrc() converts DT Scalars to string dates with many new date formatting options.

  34. New function strctodt() converts string dates to DT Scalars with many new date formatting options.

  35. New function posixtostrc() converts seconds since the Epoch to string dates with many new date formatting options.

  36. New function strctoposix() converts string dates to seconds since the Epoch with many new date formatting options.

  37. New function dttoposix() converts DT Scalar dates to seconds since the Epoch.

  38. New functions timedeltadt() and timedeltaposix() add or subtract from DT scalar or Posix date/time values in terms of user specified time units.

  39. New functions timediffdt() and timediffposix() compute the difference between dates in either DT scalar or Posix date/time values in terms of user specified time units.

  40. New functions seqadt() and seqaposix() create sequences of dates in either DT scalar or Posix date/time format with a user specified time increment.

  41. Added support for high-frequency data to Posix date/times.

  42. Final input to strsect() is now optional. New two input case: strsect() will copy from the start index to the end of the string.

  43. Final input to strindx() and strrindx() is now optional. New two input case: strindx() will start searching from the first character, while strrindx() will search from the last character.

  44. sqpSolvemt() now has the option to compute covariance matrix from cross-product of gradient.

  45. Date strings returned from xlsReadSA() (as well as loadd()) that use LibXL or xls.dll (Windows-only) now return date with time information in fixed format pattern "MM/DD/YYYY HH:MI:SS.SSS".

  46. New GUI control. Right-click on a program tab and change your working directory to the directory of that file.

  47. New GUI control. Right-click on a program tab and copy the directory containing that file to the clipboard.

  48. HiDPI scaling is enabled by default.

  49. Updated navigation bar and new icons throughout the application.

  50. All icons now have HiDPI support (eg Retina displays).

  51. User interface styling updated to use flat elements.

  52. New preference (Tools > Preferences > Edit > Default Encoding) controls default file encoding for files opened in the GAUSS editor.

  53. New option to set file encoding for individual files (Edit > Select Encoding).

  54. Bug fix: improved automatic tick label location selection for data separated by very small intervals.

  55. Bug fix: multi-dimensional array matrix multiplication in certain cases with complex matrices would return an error message instead of computing the product.

  56. Bug fix: possible crash when opening files with very long lines.

  57. Bug fix: Fix plotBox() with only 1 value.

  58. New example files: plottshf.e, robustse.e, quantilebs.e, quantilefit1.e, quantilefitloc1.e.

  59. Bug fix: Fix source browser not highlighting match in rare cases.

  60. Bug fix: Fix issue with incorrect format type passed to satostrc().

  61. Bug fix: Fix source browser replace for \rn line endings in files not currently open.

  62. OpenSSL dependencies are now bundled (Linux & Windows).


  1. Bug fix: Regression fix: varput() was not working with char literals for symbol name.

  2. Bug fix: Fix rare stack overflow for stopping programs with certain multi-dimensional structs.

  3. Bug fix: Fix memory issue with news check from 18.1.4.


  1. UI: Check for news from Aptech on startup.

  2. UI: Show full value for strings and string arrays in debug tooltips.

  3. UI: Add tooltips to debug watch widget.

  4. Perform better validation and whitespace trimming for formula strings.

  5. Specifying ‘factor’ or ‘cat’ in formula string now negates the original variable.

  6. Bug fix: in ols(), constant was not added to variable labels for ols() report in certain case.

  7. Bug fix: olsqr() trap case was not setting scalerror for 2 out / 3 in case.

  8. Bug fix: Assigning struct string member from 1x1 string array was broken.

  9. Bug fix: Recoded symbol debug tooltips. Sometimes columns didn’t align correctly. This has been fixed.

  10. Bug fix: XLS files that didn’t have a lowercase extension did not load correctly in import dialog.

  11. Bug fix: varget() now supports 1x1 string arrays.

  12. Bug fix: assigning to struct string member would crash in specific cases.


  1. Minor bug fixes, documentation and example updates.


  1. Updates for examples glmbinomial1.e, glmgamma1.e and glmnormal1.e to use formula string notation.


  1. Bug fix loading structs via GDA files.

  2. saveStruct() and loadStruct() now work with files greater than 2GB on Windows (up to 4GB).

  3. Bug fix: sampleData() could hang if ‘size’ parameter was less than 0.

  4. Bug fix: Update file access flags on Windows to prevent occasional failure reading/writing files on network drives.


  1. Add auto-update to macOS and Windows.

  2. Add tooltip to color selection buttons in UI.

  3. Added options to sort eigenvalues to the schur() function.

  4. Bug fix: Fix package installation when both legacy xml and new package json are both present.

  5. Bug fix: Support > 2GB read/writes on macOS and Linux.

  6. Bug fix: Added ability to debug functions with threadfor() statements.

  7. Other bug fixes.


  1. Allow spaces in file names and paths in GAUSS library files.

  2. Bug fix: Fix for incorrect error report when passing large numbers of extra dynamic arguments to gmmFit().

  3. Bug fix: Fixed incorrect error report with literal integer indexing of threadfor() temporary variables in certain cases.

  4. Bug fix: Fix for possible compile time stack overflow with nested structure definitions.


  1. Added initial version of package manager (gpkg) CLI. Supports installation/removal of GAUSS application package(s).

  2. Added ability to read SAS and STATA datasets with loadd() and any function that takes a formula string, such as dstatmt(), glm(), gmmFitIV().

  3. Formula strings can now apply transformations from GAUSS procedures, such as ln() and exp() as well as interaction terms.

  4. New keyword, ‘factor’, in formula strings will load specified columns as a set of dummy variables.

  5. New keyword, ‘cat’, in formula strings will load specified string columns and transform them to a vector of numeric categories.

  6. New function setBlockSize() to set the size of each chunk of data that is read from a dataset that does not fit in memory.

  7. New function getHeaders() to return the variable names from any supported data set type.

  8. New function gmmFit() computes generalized method of moments estimates from user specified moment function.

  9. New function gmmFitIV() estimates instrumental variables models using the generalized method of moments.

  10. New function gmmControlCreate() creates default gmmControl structure.

  11. New function plotCanvasSize() to programmatically control the size of graph canvas.

  12. New function plotSetTicLabelFont() to programmatically control the font, font-size and font-color of X and Y tic labels.

  13. Speed up of chained concatenation operations and scalar indexing operations by 2-4x.

  14. Speed up of x’y for the vector-vector case by 25% to 800% for vectors longer than approximately 50 elements.

  15. Speed up of 15-30% for dstat(), dstatmt() and ols() for large matrix inputs.

  16. Speed up run-time scalar performance on macOS. Smaller speed-up for all symbol types on all platforms.

  17. Speed up contour plot processing.

  18. New functions innerJoin() and outerJoin() for joining matrices on specified columns.

  19. New function delcols() to remove specified columns from a matrix.

  20. New function contains() indicates whether a matrix, multi-dimensional array or string array contains one or more elements from the second input.

  21. New functions isMember() and rowContains() indicate whether any element of a matrix, or any element of a row of a matrix, 2-dimensional array or string array contains one or more elements from the second input.

  22. New function strreplace1() to replace all instances of a substring in a string or string array with another substring.

  23. New function squeeze() to remove singleton dimensions from a multi-dimensional array.

  24. New function blockDiag() to create a block-diagonal matrix from multiple input matrices.

  25. New function besselk() computes the modified Bessel function of the second kind.

  26. New function rndRayleigh() to compute Rayleigh distributed random numbers.

  27. New functions blendColorPalette(), getColorPalette(), getHSLPalette(), getHSLuvPalette() and listColorPalettes() to simplify the process of creating modern, professional and attractive color palettes for graphics.

  28. Updated default color palettes for 2-D graph types.

  29. New define __FILE_DIR returns the directory in which the file is located.

  30. New functions cdfTruncNorm() and pdfTruncNorm() to compute the cumulative distribution function and the probability density of the truncated normal distribution.

  31. New functions cdfLogNorm() and pdfLogNorm() to compute the cumulative distribution and probability density functions of the log-normal distribution.

  32. Add initialization ability for GAUSS libraries. Placing a file named [libname]_init.src in the same directory as the library lcg file will cause that file to be ran when ‘library [name]’ is referenced.

  33. Increase preprocessor #define max length from 40 to 1024.

  34. Add globstar wildcard matching to gauss.cfg. See distributed gauss.cfg with pkgs example.

  35. Added optional inputs mean and standard deviation to cdfn(), and pdfn().

  36. Added support for multi-dimensional array inputs to pdfn(), erf(), erfc(), erfInv(), erfcInv(), the power operator ‘^’.

  37. Added ability to pass string array as X axis tic labels for plotXY() and plotScatter().

  38. Added ability to right-click a struct member in a floating symbol editor window to open it in another window for the purpose of simultaneously viewing more than one member of a structure.

  39. The function browser will now located structure definitions as well as proc definitions.

  40. ‘Toggle block comment’ can now comment out selections within a single line of code as well as adding multi-line comments.

  41. Added ability for ExE conformable vector inputs to europeanBSCall(), europeanBSPut().

  42. Added ability to add scatter, xy and other 2-D plot types to an existing contour plot.

  43. Updated olsmt() to make control structure an optional input.

  44. Watch window struct tree remembers expansion state and scrollbar position on reload (ie debug step in/over etc).

  45. Watch window struct vars can now be cloned into their own watch window.

  46. Preferences are now saved to disk when after ‘Apply’ or ‘OK’ has been selected instead of when GAUSS exits.

  47. Bug fix: Fix alt+left Edit Page navigation becoming unresponsive sometimes.

  48. Bug fix: Watch windows were sometimes not prevented from updating during program run, which could cause crash.

  49. Bug fix for writer returning 0 on successful writes to HDF5 files, rather than number of written rows.

  50. Bug fix: gdaReadStruct() on Linux can now read structs created on Windows and Mac.

  51. Bug fix: Data Page preview and Debug Page Watch Symbols list took more memory than necessary for sparse matrices.

  52. Bug fix: Fix minor memory leaks.

  53. Added optional input to cdfEmpirical() to allow specification of the number of bins/breakpoints to use.

  54. Behavior change: cdfEmpirical() now returns the breakpoints as well as the cumulative probability. This will require use of cdfEmpirical() to assign to two return values.

  55. Behavior change: plotAdd() calls will now inherit curve level settings from the initial plot call. This should only be noticeable in cases in which a plotControl structure is passed in to create the initial graph and subsequent plotAdds() to not use a plotControl structure. This does not require a code change. See User Guide > GAUSS Graphics > Adding data to existing plots for more details.

  56. Behavior change: Application modules will now be installed under GAUSSHOME/pkgs/PKG_NAME, where GAUSSHOME is your GAUSS installation directory and PKG_NAME is the name of the installed application module, i.e. tsmt. This does not require code change. Further, this path can be configured through gauss.cfg.

  57. Behavior change: Global variable __row is no longer referenced, use setBlockSize() instead. Note that this will not prevent older code from running correctly, but may result in less than optimal sizing of data blocks for which are explicitly processed in chunks which were previously controlled by __row.

  58. New example programs: cdfempirical.e, gmm_auto_ols.e, gmm_hsng1_iv.e, gmm_hsng2_iv.e, gmmfitiv_auto.e, gmmfitiv_hsng.e, gmm_tdist.e.


  1. Bug fixes.


  1. Added more complete compile time checks for indexing errors and incorrect use of hat operator for strings.

  2. Bug fix for possible crash in sampleData() when requesting a sample smaller than 40% of the total observations without replacement.

  3. Bug fix crash when loading .plot file with empty LaTeX text boxes.

  4. Bug fix for threadfor() and threadendfor() not indenting properly in editor.

  5. Bug fix for quantiled() returning out-of-memory error with certain datasets.

  6. Removed unnecessary dependency of Qt shared libraries for GAUSS Engine when using libcql_stubs.dylib on Mac.


  1. Added support for new graphics with the GAUSS Engine.

  2. Added tooltips on hover for elements that are partially out of view on the Data Page.

  3. Bug fix for cutting off final portion of the last x-axis tick label in rare circumstances with time series plots.

  4. Bug fix for memory bug in specific case related to unique and string array concatenation.

  5. Bug fix of possible hang with debugger ‘Run to cursor’ button.

  6. Bug fixes for specific cases with cdftnc().

  7. Documentation and input check improvements to polygamma().


  1. (Windows) Added GUI license management utility for floating network licenses, rlmservice.exe.

  2. Bug fix: Fixed possible folder duplication in Source Browser.

  3. Bug fix for program files not saving on run, in specific cases.

  4. Bug fix for possible underflow in cdftnc().

  5. Added ability to remove tgauss dependency on Qt libraries.

  6. Other minor documentation enhancements and bug fixes.


  1. Up to 2-5x speed increase for least squares estimation, using the slash operator ‘/’ for non-square coefficient matrices with few columns (approximately 1-15) and few rows (approximately 2-100).

  2. Bug fix: File import dialog now supports empty sheet names for Excel files.

  3. Added support for pasting data to the matrix editor from applications that use the legacy carriage return only line ending on Mac.


  1. Increased scalability of threadFor() and threadBegin().

  2. GAUSS commands that process datasets can now also process .fmt, and .h5 files as well as .dat.

  3. New support for HDF5 datasets, allows unlimited sized datasets.

  4. Added support for an initial subset of Wilkinson-Rogers formula notation for functions such as dstat(), dstatmt(), glm(), momentd(), ols(), olsmt() and more.

  5. CSV and Excel (.xls, .xlsx) files can be used as datasets for functions quantiled(), dstatmt(), glm(), momentd(), ols(), olsmt() and more.

  6. New function cdfEmpirical() for computing the empirical cumulative distribution function, and plotcdfEmpirical() to graph it.

  7. New function plotAddErrorBar() adds error bars to 2-D plots.

  8. New function plotAddSurface() adds additional surfaces to an existing surface plot.

  9. New function plotSetLegendFont() to control the font family, size and color used in the legend.

  10. New function plotSetZLevels(): user control for the height of levels, rather than just the number of contour levels.

  11. New function plotSetContourLabels(): controls whether numeric label containing contour level height is drawn, as well as the format of the numeric label.

  12. New color maps for surface and contour plots.

  13. Added option to specify the units and dpi of graphs saved with plotSave().

  14. Added control for the range of the X and Y axes to the graphics editor.

  15. Added option to control units of graph size and DPI to plotSave().

  16. Added control for viewing angle, lighting, zoom and toggling appearance of the wireframe for surface plots to the graphics editor.

  17. New function sylvester() to compute the solution, X, to the equation AX + XB = C.

  18. schur() can now, optionally, return the real or complex Schur form.

  19. New function dot() to compute the dot product of a column or the columns of a matrix.

  20. New function powerM() to raise a matrix to a specified power.

  21. getdims() will now return the number of dimensions of a matrix, string or string array.

  22. getorders() will now return the number of rows and columns for matrices, strings or string arrays.

  23. Greatly improved speed and decreased memory usage for reclassify().

  24. Greatly improved performance of unique() and uniquesa() for string arrays.

  25. Greatly improved performance of sortc() for column vectors.

  26. Greatly improved performance of linear solve using the slash operator (/) for small matrices and X’X matrix multiplication for large matrices.

  27. Greatly improved performance of kronecker() product operator (.*.) when one of the matrices is a column vector.

  28. Improved performance of cdffc() when the d1 parameter is equal to one, by 10-1000x.

  29. Improved performance of crossprd() for the case with fewer than 500 vectors.

  30. Added support for complex inputs to hess() and significant speed up for real matrix inputs larger than approximately 30x30.

  31. tgauss can now create new ‘plot’ graphics.

  32. New function rndWishartInv() for taking draws from the Inverse Wishart distribution.

  33. New function pdfWishartInv() computes the probability density function of the Inverse Wishart distribution.

  34. New function ldl() computes the LDL decomposition of a positive semi-definite matrix and returns separate L and D factors.

  35. Added support for generalized linear model function, glm() for inverse-Gaussian distribution and model without an intercept.

  36. New function strtrim() to remove white space from left and right side of elements of a string array.

  37. Added support for multi-character delimiters to strsplit().

  38. New function strjoin() to combine string array elements into a string separated by a specified delimiter. This function does NOT add a delimiter after the final element as in strcombine().

  39. Editor now grays out code that is inactive due to a #define.

  40. Application Install Wizard can install multiple GAUSS application modules at once.

  41. Performance improvement: The “forward only” flag (dbQuerySetForwardOnly()) now defaults to true.

  42. Bug fix for find-and-replace with UTF-8 multibyte characters.

  43. Bug fix: added support for strings to selif() and delif() and fixed memory bug in delif().

  44. Bug fix: crash when all points sent to plotLogX(), plotLogY() or plotLogLog() were between 10^n and 10^n+1.

  45. Bug fix: errorlog() and errorlogat() now accept 1x1 string arrays as well as strings.

  46. Bug fix: intsimp() would fail with an error when attempting to integrate a function that returned only zeros.

  47. Bug fix: ability to scroll to right end in program input/output window with long lines.

  48. New example files: dstatmth5.e, glmnormalh5.e, plotadddsurf1.e, plotadderrorbar1.e, plotadderrorbar2.e, plotarea_ci_latex.e, plotcontour2.e and plotxy_latex1.e.


  1. Bug fixes.


  1. Data Import Wizard now supports GAUSS Data sets (*.dat, *.fmt, *.fst).

  2. Debugger now supports loading previous stack frames and viewing frame-specific symbols.

  3. Improved breakpoint/bookmark behavior.

  4. Improved file opening behavior from finder on OSX.

  5. Bug fix: Fix various memory leaks.

  6. Bug fix: Support plotAddArea() and plotAddBar() to existing time-series plots.

  7. Bug fix: Fix following symlinks for file paths.

  8. Bug fix: Fix ‘Find Usages’ for struct members.

  9. Bug fix: Support debug tooltips for struct members.

  10. Bug fix: Fix 3D preview, title rendering and exporting for OSX Retina devices.

  11. Bug fix: Fix previous document shortcut not activating for Windows/Linux.

  12. Bug fix: Remove ‘Delete’ option from context menu for undeleteable items in graphics page.

  13. Bug fix: Improve autocomplete for structs and struct reference arguments in procs.


  1. New function csvWriteM() writes data to a delimited text file from a GAUSS matrix.

  2. Added ability to toggle bolding of functions in Edit Page.

  3. Bug fix: plotPolar() now supports line symbols.

  4. Bug fix: plotAddAnnotation() did not maintain correct z-order for added annotations.

  5. Bug fix: Fix 3D graph export dialog starting size constraints.

  6. Bug fix: Fix ‘Properties’ context menu item on graphics page not coming to top.

  7. Bug fix: Fix semi-colons in strings, causing Format Text (code formatting) option to add line break inside string.

  8. Bug fix: Fix starting indent keywords in Edit Page being case-sensitive.

  9. Bug fix: Properly display long error messages that wrap.

  10. Added internal check for, and removal of, completely zero imaginary portion of a complex matrix on input to function lu().

  11. Bug fix: Add complex support for function lu() on Mac (already supported on Windows and Linux).

  12. Bug fix: Fix memory leak in function threadfor() in some specific situations.


  1. Added ability for csvReadM() and csvReadSA() to read data from the standard input stream (stdin). Pass __STDIN as the filename argument to csvReadM() and csvReadSA().

  2. Added ability for fgets(), fgetsa(), fgetsat(), and fgetst() to read from the standard input stream (stdin) . Pass __STDIN as the file handle to fgets(), fgetsa(), fgetsat(), and fgetst().

  3. Added ability for fputs() and fputst() to send data to the standard error stream (stderr) and the standard output stream (stdout). Pass \__STDERR or \__STDOUT as the file handle to fputs() and fputst().

  4. Changed R-squared calculation in ols() for regression through the origin to prevent possibility of negative R-squared.

  5. Bug fix: GAUSS source path was not searched when a file name was passed to GAUSS on the command line at start up.

  6. Bug fix: csvReadM() and csvReadSA() skipped final line in CSV file if the initial line was blank and csvRead() was told to skip lines.

  7. Bug fix: cons would continue to return the final buffer data after hitting EOF.


  1. Added Data Import Wizard.

  2. New functions csvReadM() and csvReadSA() read data from a delimited text file into a GAUSS matrix or string array.

  3. New function glm() calculates the generalized linear model.

  4. New function rescale() provides for scaling columns of a matrix.

  5. New function sampleData() takes samples with or without replacement from a GAUSS matrix.

  6. New function qz() computes the sorted complex QZ decomposition.

  7. New function plotSetAxesPen() sets the color and line thickness of the axes line.

  8. New functions added for data recoding/reclassification: reclassify() and reclassifyCuts().

  9. Added the following new statistical distribution functions: pdfBinomial(), pdfPoisson(), cdfHyperGeo(), pdfHyperGeo() and rndHyperGeo().

  10. New function integrate1d() uses adaptive quadrature to integrate a user-defined function over a specified range.

  11. Added new compiler command #ifmac to designate code blocks to be compiled and run only on a Mac.

  12. Added additional, optional argument to rndi() to specify the range of random integers produced.

  13. Added option to pass additional data to integration functions intquad1(), intquad2() and intquad3().

  14. Added additional, optional input to lapgschur() to specify sorting of the eigenvalues.

  15. Add additional, optional argument to strsplit() to specify delimiter.

  16. Significant speed up to svd(), svd1(), svd2(), svds(), svdcusv() and svdusv().

  17. Significant speed up to indnv().

  18. Added ability to pass a variable number of arguments to GAUSS procedures.

  19. Removed requirement to use a DS structure, added option to directly pass a variable number of matrices and made control structure optional for eqsolvemt(), qnewtonmt(), and sqpsolvemt().

  20. Removed requirement to use DS structure and added option to directly pass matrices to all gradient and hessian functions (gradMT(), gradMTm(), gradMTT(), hessMT(), hessMTm(), hessMTg(), hessMTgw(), hessMTT(), etc).

  21. Removed requirement to pass control structure to dstatmt().

  22. Made inputs other than file name optional for xlsReadM(), xlsReadSA(), xlsWrite(), xlsWriteM(), xlsWriteSA(), xlsGetSheetSize(), spreadSheetReadM(), spreadSheetReadSA(), and spreadSheetWrite().

  23. F4 hot-key will now run the current statement and then skip to the next in addition to running highlighted text.

  24. Improved integration of source editor and debugger. Project view window, ‘find usages’, editing source and other source editor features are available on debug page.

  25. Added multiple new preference options to Tools > Preferences > Debug Page to control opening and closing of temporary files and other debug page behavior.

  26. New preference option added to activate autocomplete only manually on Edit Page (with Ctrl+Space).

  27. Added autocomplete and tooltips to program input/output window.

  28. Added preference to Tools > Preferences > Command to activate autocomplete only manually (with Ctrl+Space).

  29. Added bolding and separate color control syntax highlighting for all GAUSS and user defined procedures (Tools > Preferences > Edit Page > Functions).

  30. Added support for Ctrl+E to open a symbol selected in the program input/output window into a floating symbol editor.

  31. Added support for F4 to run highlighted text in program input/output window.

  32. Added sysstate` cases to assess variable arguments passed in to a GAUSS procedure as ‘…’.

  33. Symbol editors remember format preferences until closed instead of using default preferences whenever refreshed.

  34. Speed up for load time of GAUSS when very large folders are open in project view window.

  35. Improved behavior of file associations on Mac.

  36. Autocomplete no longer pops up when deleting characters or in the middle of a word.

  37. Bug fix for display of gaps between bars of a histogram when using plotAddHistP() in some cases.

  38. Bug fix for situation in which a message box could be hidden and unreachable behind a floating symbol editor.

  39. Bug fix: autocomplete pop-up window no longer stays visible when page loses focus.

  40. Bug fix: ‘find usages’ did not find instances of variables that were index assigns (i.e. x[5] = 7;).

  41. Bug fix: Dock widgets incorrectly reset to minimum width in some instances of page change and restart GAUSS.

  42. New example programs: glmbinomial1.e, glmbinomial2.e, glmbinomial3.e, glmgamma1.e, glmgamma2.e, glmgamma3.e, glmnormal1.e, glmnormal2.e, glmpoisson1.e, glmpoisson2.e, qnewtonmt2.e, qnewtonmt3.e, qnewtonmt4.e, sqpsolvemt1.e, sqpsolvemt_nlls.e, sqpsolvemt_frontier.