I was interested in exploring Multivariate Analysis in B4X. This topic includes:
covariance, correlations, multivariate analysis of variance (MANOVA),
multiple linear regression (MLR), principal component analysis (PCA),
factor analysis with factor rotation (VARIMAX), multidimensional scaling (MDS)
cluster analysis, logistic regression, and more.
Very soon I realized I needed a flexible double precision matrix class. After I developed
one I was comfortable with (dMatrix), I found that for some multivariate procedures, complex numbers
make things much more elegant and concise. So I started on developing a class (cMatrix) for that.
This task became trivial when I realized that a matrix of complex numbers can be thought of as a pair of matched
and synchronized matrices of double precision numbers. Most of the work could be done by dMatrix.
So here I present the two classes, as well as a series of examples, including two MLR projects and one
Factor Analysis project.
Preparing for this submission, I found it awkward to describe things without showing both the code
and the results in the same window, so I also developed a class dedicated to doing that: WiLDemo.
One thing leads to another. To choose between examples, I used B4XListTemplate in a separate class (WiLOptions)
This class takes an array of items and displays it across platforms in a simplified way.
When I started to implement the statistics examples, I needed a class to compute cumulative probability density values.
For this class (WiLStats) I was able use part of one of my other projects, NCrunchR:
https://www.b4x.com/android/forum/threads/numbercruncherandstatisticalpackageintegrator.102566/
[The present project is part of a remake of NCrunchR I am working on that will be based on B4XPages and B4XTable]
There is a library/class wrapping of JAMA authored by Johan Schoeman. It is very good but doesn't meet my needs in this case.
https://www.b4x.com/android/forum/threads/jamaajavamatrixpackageb4awrapperinpost3.59192/
I needed a B4X matrix class that would do all the standard things that R, MATLAB, Python and others can do with matrices.
1. It should have a simple syntax
2. It should be able to display itself
3. It should be chainable: Matrix.method1.method2.method3 etc.
4. It should have inverse, single value decomposition and eigen vectors/values implemented in native B4X
5. It should make efficient use of B4X facilities
6. It should be multiplatform
7. It should be independent of other packages such as R
8. It should have builtin error reporting with traceable names
9. It should avoid cryptic indexing for applying methods to rows, columns, elements
10.It should be able to accomodate missing values, and handle them in functions like sum and find
Instances of dMatrix have four public properties and more than 60 public methods:
id = a string version of the variable name (used to identity matrices involved in erroneous operations)
nr = number of rows
nc = number of columns
x = the 2 dimensional array of double precision numbers
Instances of cMatrix have five public properties: id, nr, nc, dMx_R, dMx_I
where dMx_R (Real part) and dMx_I (Imaginary part) are instances of dMatrix
The attached project is based on B4XPages. It works in B4J and B4A, but I haven't tested it in B4i.
Other than defining fx, and a monospaced font, there is no platform specific code.
B4XPages makes it simple to show different reports (without unnecessarily recomputing them)
and different instances of a report class. Composing statistical reports is also greatly simplified
by using BBCodeView in report classes.
dMatrix and cMatrix have no dependencies and work with or without B4XPages on B4J and B4A and probably on B4i (not tested).
The code is here for all to use as desired, I'll use it for my own purposes, and I don't plan to commercialize it.
I have tested it extensively, but I have to make a disclaimer. If you use this code, then you are responsible
for it's correctness and the appropriateness of it's application. If you publish it, include a link to this post.
If you use statistics for scholarly or professional work you must use SPSS, SAS, MATLAB, R, or other established package.
If you like to experiment or learn about the inner workings works of statistics, you may be interested in this.
If you find errors, omissions, or lack of clarity, I would like to fix them. So let me know.
The classic work on this was done many years ago, including the 'pivotal' work of Carl Friedrich Gauss (17771855).
I want to acknowledge the influence of the programming language APL designed in the 1960s by Kenneth E. Iverson.
APL is an arraybased language. In 1972 it was implemented successfully on an 8K CPU with 64k of ROM  the MCM700.
My fondness for APL, while not shared by many, inspired me to develop dMatrix for B4X, which is now my alltime favourite.
Note: Size constraints required splitting up the project. Unzip the following 3 zip files into a single folder, and all will be Ok.
covariance, correlations, multivariate analysis of variance (MANOVA),
multiple linear regression (MLR), principal component analysis (PCA),
factor analysis with factor rotation (VARIMAX), multidimensional scaling (MDS)
cluster analysis, logistic regression, and more.
Very soon I realized I needed a flexible double precision matrix class. After I developed
one I was comfortable with (dMatrix), I found that for some multivariate procedures, complex numbers
make things much more elegant and concise. So I started on developing a class (cMatrix) for that.
This task became trivial when I realized that a matrix of complex numbers can be thought of as a pair of matched
and synchronized matrices of double precision numbers. Most of the work could be done by dMatrix.
So here I present the two classes, as well as a series of examples, including two MLR projects and one
Factor Analysis project.
Preparing for this submission, I found it awkward to describe things without showing both the code
and the results in the same window, so I also developed a class dedicated to doing that: WiLDemo.
One thing leads to another. To choose between examples, I used B4XListTemplate in a separate class (WiLOptions)
This class takes an array of items and displays it across platforms in a simplified way.
When I started to implement the statistics examples, I needed a class to compute cumulative probability density values.
For this class (WiLStats) I was able use part of one of my other projects, NCrunchR:
https://www.b4x.com/android/forum/threads/numbercruncherandstatisticalpackageintegrator.102566/
[The present project is part of a remake of NCrunchR I am working on that will be based on B4XPages and B4XTable]
There is a library/class wrapping of JAMA authored by Johan Schoeman. It is very good but doesn't meet my needs in this case.
https://www.b4x.com/android/forum/threads/jamaajavamatrixpackageb4awrapperinpost3.59192/
I needed a B4X matrix class that would do all the standard things that R, MATLAB, Python and others can do with matrices.
1. It should have a simple syntax
2. It should be able to display itself
3. It should be chainable: Matrix.method1.method2.method3 etc.
4. It should have inverse, single value decomposition and eigen vectors/values implemented in native B4X
5. It should make efficient use of B4X facilities
6. It should be multiplatform
7. It should be independent of other packages such as R
8. It should have builtin error reporting with traceable names
9. It should avoid cryptic indexing for applying methods to rows, columns, elements
10.It should be able to accomodate missing values, and handle them in functions like sum and find
Instances of dMatrix have four public properties and more than 60 public methods:
id = a string version of the variable name (used to identity matrices involved in erroneous operations)
nr = number of rows
nc = number of columns
x = the 2 dimensional array of double precision numbers
Instances of cMatrix have five public properties: id, nr, nc, dMx_R, dMx_I
where dMx_R (Real part) and dMx_I (Imaginary part) are instances of dMatrix
The attached project is based on B4XPages. It works in B4J and B4A, but I haven't tested it in B4i.
Other than defining fx, and a monospaced font, there is no platform specific code.
B4XPages makes it simple to show different reports (without unnecessarily recomputing them)
and different instances of a report class. Composing statistical reports is also greatly simplified
by using BBCodeView in report classes.
dMatrix and cMatrix have no dependencies and work with or without B4XPages on B4J and B4A and probably on B4i (not tested).
The code is here for all to use as desired, I'll use it for my own purposes, and I don't plan to commercialize it.
I have tested it extensively, but I have to make a disclaimer. If you use this code, then you are responsible
for it's correctness and the appropriateness of it's application. If you publish it, include a link to this post.
If you use statistics for scholarly or professional work you must use SPSS, SAS, MATLAB, R, or other established package.
If you like to experiment or learn about the inner workings works of statistics, you may be interested in this.
If you find errors, omissions, or lack of clarity, I would like to fix them. So let me know.
The classic work on this was done many years ago, including the 'pivotal' work of Carl Friedrich Gauss (17771855).
I want to acknowledge the influence of the programming language APL designed in the 1960s by Kenneth E. Iverson.
APL is an arraybased language. In 1972 it was implemented successfully on an 8K CPU with 64k of ROM  the MCM700.
My fondness for APL, while not shared by many, inspired me to develop dMatrix for B4X, which is now my alltime favourite.
Note: Size constraints required splitting up the project. Unzip the following 3 zip files into a single folder, and all will be Ok.
Attachments

244.2 KB Views: 15

150 KB Views: 16

107.7 KB Views: 17