The independent component analysis (ICA) is a popular technique adopted to approach the so-called blind source separation (BSS) problem, i.e., the problem of recovering and separating the original sources that generate the observed data. However, the independence condition is not easy to impose, and it is often necessary to introduce some approximations. Here we provide a MATLAB code which implement a modified variational Bayesian ICA (vbICA) method for the analysis GNSS time series. The vbICA method models the probability density function (pdf) of each source signal using a mix of Gaussian distributions, allowing for more flexibility in the description of the pdf of the sources with respect to standard ICA, and giving a more reliable estimate of them. In particular, this method allows to recover the multiple sources of ground deformation even in the presence of missing data. This material is based on the original work of Choudrey (2002) and Choudrey and Roberts (2003), subsequently adapted by Gualandi et al. (2016) and Serpelloni et al. (2018) for the study of GNSS position time series.
Steps to reproduce
Put your GNSS data in the Data folder. They must be in the same format as the one you can find there. Go to the Scenarios/casestudy/case1/dataset folder. In stn_list is present a file with the path of all the GNSS time series you want to use, which is called by the file data_input_file.txt Make sure that all the paths are correct. Consider now the parameter_files folder and consider the scen_parameters.m file. In this file you can choose the initial/final epoch, the number of components you want to use for the decomposition (options.scen.N ), threshold for time series and epochs missing data. options.scen.select.r and options.scen.select.origin allow you to consider only GNSS stations within a radius of 'center options.scen.select.origin' and length (in km) 'options.scen.select.r'. If you choose a very large radius, you will take into account all the GPS stations. You can take a look also to the other files in the parameter_files folder. Once set the initial epochs and the number of independent components you want, you can run the code (ICAIM_code/ICA_driver_clean.m). If everything goes right, it will generate a matfile called all.mat in ICAIM_code/Scenarios/casestudy/case1/matfiles. In the ICA variable you can find the temporal evolution of each ICs (ICA.V), the spatial distribution (ICA.U) and the weights (ICA.S). ICA.U rows are three times longer than the number of each GPS station because, if for example you have 2 GPS stations ABCD and EFGH, the U columns are (ABCD_east ABCD_north ABCD_up EFGH_east EFGH_north EFGH_up). The first column of ICA.U is associated with IC1, the second column of ICA.U is associated with IC2 ecc.. Please note that this code was developed with an old version of MATLAB (2014b).