function y = gskewness(x,n)
%GSKEWNESS Skewness of a grouped sample.
% In some scientific works, once the data have been gathered from a
% population of interest, it is often difficult to get a sense of what
% the data indicate when they are presented in an unorganized fashion.
% Assembling the raw data into a meaningful form, such as a frequency
% distribution, makes the data easier to understand and interpret. It is
% in the context of frequency distributions that the importance of
% conveying in a succinct way numerical information contained in the data
% is encountered.
% So, grouped data is data that has been organized into groups known as
% classes. The raw dataset can be organized by constructing a table
% showing the frequency distribution of the variable (whose values are
% given in the raw dataset). Such a frequency table is often referred to
% as grouped data.
% Here, we developed a m-code to calculate the skewness of a grouped data.
% One can input the returns or modified vectors n and xout containing the
% frequency counts and the bin locations of the hist m-function, in a
% column form matrix.
% GSKEWNESS(X,0) adjusts the skewness for bias (correction by small sample
% size). GSKEWNESS(X,1) is the same as GSKEWNESS(X), and does not adjust
% for bias.
% If skewness = 0, the data are perfectly symmetrical. But a skewness of
% exactly zero is quite unlikely for real-world data. Here, we use the
% Bulmers' rule of thumb criterium (1979), about how we can to
% interpret the skewness number:
% - Less than ?1 or greater than +1, the distribution is highly skewed
% - Between ?1 and ?0.5 or between +0.5 and +1, the distribution is
% moderately skewed
% - Between ?0.5 and +0.5, the distribution is approximately symmetric
% Skewness calculation uses the formula,
% g1 = m3/m2^1.5, do not adjusted for bias
% G1 = SQRT(N*(N - 1))/(N - 2) * g1, adjusted for bias
% m2 = second moment of the sample about its mean
% m3 = third moment of the sample about its mean
% N = sample size
% Syntax: function y = gskewness(x,n)
% x - data matrix (Size of matrix must be n-by-2; absolut frequency=
% column 1, class mark=column 2)
% n - adjusted for bias = 0 (default), do not adjust for bias = 1
% y - skewness of the values in x
% Example: Suppose we have the next frequency table:
% MC F
% 61 5
% 64 18
% 67 42
% 70 27
% 73 8
% Taken from: http://www.tc3.edu/instruct/sbrown/stat/shape.htm
% Where we are interested to get the skewness value adjusted for bias.
% Data input:
% x=[61 5;64 18;67 42;70 27;73 8];
% Calling on Matlab the function:
% y = gskewness(x,0)
% Answer is:
% y = -0.1098
% Created by A. Trujillo-Ortiz, R. Hernandez-Walls and
% C.M. Espinosa-Lagunes
% Facultad de Ciencias Marinas
% Universidad Autonoma de Baja California
% Apdo. Postal 453
% Ensenada, Baja California
% Copyright (C) September 24, 2012.
% To cite this file, this would be an appropriate format:
% Trujillo-Ortiz, A., R. Hernandez-Walls and C.M. Espinosa-Lagunes. (2012).
% gskewness:Skewness of a grouped sample. [WWW document].
% URL http://www.mathworks.com/matlabcentral/fileexchange/
% Bulmer, M. G. (1979), Principles of Statistics. NY:Dover Books on
% Jayaraman, K. (1999), A Statistical Manual for Foresty Research. Foresty
% Research Support Programme for Asia and the Pacific. FAO-
% Corporate Document Repository. Forestry Statistics and Data
% URL http://www.fao.org/DOCREP/003/X6831E/X6831E00.HTM
% PDF ftp://ftp.fao.org/docrep/fao/003/X6831E/X6831E00.pdf
if nargin < 2,
n = 1; %default
c = size(x,2);
if c ~= 2
error('stats:gskewness:BadData','X must have two colums.');
mc = x(:,1); %class mark
f = x(:,2); %absolut frequency
s = sum(f.*mc);
m1 = s/sum(f);
m2 = sum(f.*(mc - m1).^2)/sum(f);
m3 = sum(f.*(mc - m1).^3)/sum(f);
g1 = m3/m2^1.5;
if n == 0;
y = sqrt(sum(f)*(sum(f) - 1))/(sum(f) - 2) * g1; %skewness adjusted for
else n = 1; %default
y = g1; %skewness not adjusted for bias