knitr::opts_chunk$set( fig.width=8, fig.height=4, collapse = TRUE, comment = "#>" )
The package aims at unveiling a technique called covariate matching, which takes in different data sets and returns data sets whose feature values exhibit similar characteristics or similar distribution. In other words, if a wind speed of 3.2 m/s exists in one data set, the algorithm tries to find wind speed in the vicinity of 3.2 m/s in the other data set.
Covariate matching methods are rooted in the statistical literature. In stabilizing the non-experimental discrepancy between non-treated and treated subjects of observational data, covariate distributions are adjusted by selecting non-treated subjects that have a similar covariate condition as that of treated ones. Through the process of matching, non-treated and treated groups become only randomly different on all background covariates, as if these covariates were designed by experimenters. As a result, the outcomes of the matched non-treated and treated groups, which keep the originally observed values, are comparable under the matched covariate conditions.
Covariate matching is a technique to adjust covariates distribution to make treated and non treated group to have the same covariates condition.
Covariate matching is broadly divided into steps : Hierarchial subgrouping and one to one matching.
Locate a data record in the treated group, Qaft, and label it by the index j.
Select one of the covariates, for instance, wind speed, V , and designate it as the variable of which the similarity between two data records is computed.
Go through the data records in the non-treated group, Qbef, by selecting the subset of data records such that the difference, in terms of the designated covariate, between the data record j in Qaft and any one of the records in Qbef is smaller than a pre-specified threshold. When V is in fact the one designated in Step 2, the resulting subset is then labeled by placing V as the subscript to Q, namely QV.
Next, designate another covariate and use it to prune QV in the same way as one prunes Qbef into QV in Step 3. Doing so produces a smaller subset nested within QV . Then continue with another covariate until all covariates are used.
Select the most similar record from Qbef for each Qaft using mahalanobis distance as the similarity measure.
Remove the record from Qaft, if a record in Qbef satisfies the above mentioned criteria.
Repeat the process for each record in Qaft
Load the library
library(WindPlus)
Function : covmatch.binary(dname, cov, weight, cov_circ)
cov_circ - vector defining position or column number of circular covariates such as wind direction, nacelle position etc.
Matching multiple data sets
Function : covmatch.mult(dname, cov, weight, cov_circ)
Even though, the arguments seem pretty similar for both the functions, there is a subtle difference in execution. For matching multiple data sets, data set is matched once, whereas for macthing two data sets, the matching is done twice keeping each of the data set as a reference. Since the method is entirely subjective, an exact explanation of such is not possible.
The two data sets attached to make use of function covmatch.binary for users are data1 and data2. The data can be made available after installing the package and loading the library. The data sets correspond to wind energy data set, and both of these are two different turbines data aggregated by 10 minutes over a year.
head(data1)
head(data2)
The three data sets attached to make use of function covmatch.mult for users are Season1, Season2 and Season3. The data sets correspond to wind energy data set of a single turbine, splitted in 3 seasons over a year.
head(Season1)
head(Season2)
head(Season3)
# Prepare data set for matching dname = rep(list(), 2) dname[[1]] = data1 dname[[2]] = data2 # Non circular covariates column cov = c(6, 1, 13) # Weight weight = c(0.1, 0.1, 0.05) # Matching matched = covmatch.binary(dname = dname, weight = weight, cov = cov, cov_circ = NULL) # Commpare result of one covariate with original data par(mfrow = c(1, 2)) par(bg = 'grey') plot(density(dname[[1]][, 13]), col = 'red', main = 'Before Matching', xlab = 'Turbulence Intensity', lwd = 2, xlim = c(0, 0.8), ylim = c(0, 8)) lines(density(dname[[2]][, 13]), col = 'blue', lwd = 2, ylim = c(0, 8), xlim = c(0, 0.8), ylim = c(0, 8)) legend('topright', legend = c('data1', 'data2'), col=c("red", "blue"), lty=1, lwd = 2) plot(density(matched[[1]][, 13]), col = 'red', main = 'After Matching', xlab = 'Turbulence Intensity', lwd = 2, xlim = c(0, 0.8), ylim = c(0, 8)) lines(density(matched[[2]][,13]), col = 'blue', lwd = 2, xlim = c(0, 0.8), ylim = c(0, 8)) legend('topright', legend = c('data1', 'data2'), col=c("red", "blue"), lty=1, lwd = 2)
# Prepare data set for matching dname = rep(list(), 3) dname[[1]] = Season1 dname[[2]] = Season2 dname[[3]] = Season3 # Non circular covariates column cov = c(1, 6, 14) # Weight weight = c(0.2, 0.2, 0.2) # Matching matched = covmatch.mult(dname = dname, weight = weight, cov = cov, cov_circ = NULL) # Commpare result of one covariate with original data par(mfrow = c(1, 2)) par(bg = 'grey') plot(density(dname[[1]][, 1]), col = 'red', main = 'Before Matching', xlab = 'Wind Speed (m/s)', lwd = 2, xlim = c(0, 20), ylim = c(0, 0.18)) lines(density(dname[[2]][, 1]), col = 'blue', lwd = 2, xlim = c(0, 20), ylim = c(0, 0.18)) lines(density(dname[[3]][, 1]), col = 'green', lwd = 2, xlim = c(0, 20), ylim = c(0, 0.18)) legend('topright',legend = c('Season1', 'Season2', 'Season3'), col=c("red", "blue", "green"), lty=1, lwd = 2) plot(density(matched[[1]][, 1]), col = 'red', main = 'After Matching', xlab = 'Wind Speed (m/s)', lwd = 2, xlim = c(0, 20), ylim = c(0, 0.18)) lines(density(matched[[2]][, 1]), col = 'blue', lwd = 2, xlim = c(0, 20), ylim = c(0, 0.18)) lines(density(matched[[3]][, 1]), col = 'green', lwd = 2, xlim = c(0, 20), ylim = c(0, 0.18)) legend('topright',legend = c('Season1', 'Season2', 'Season3'), col=c("red", "blue", "green"), lty=1, lwd = 2)
The task at hand is to find the observations from two or more different set, which exhibit similar characteristics. The functions return a list containing the data sets only with matched observations. It should be kept in mind that, only the supplied covariates are matched. Even though data set containing all the columns are returned back, the columns of interest should be looked into.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.