# Error in apply(dat[, batch == batch_level], 1, function(x) { : dim(X) must have a positive length

I am new here so forgive me if I don't provide all the details in the first go. There is a very similar question (how to solve “dim(X) must have a positive length” at running ComBat function in R) but the solution did not work for me.

I am getting Error in apply(dat[, batch == batch_level], 1, function(x) { : dim(X) must have a positive length when I use the sva library's comBat() function.

It works when I use the following:

> dim(log_proteins_norm_sorted)
[1] 5415   66

> log_proteins_norm_sorted[1:5,1:5]
1027     1075     1116     1119    11211
1 22.50513 20.64312 21.56182 22.01455 23.17497
2 21.67946 20.90994 21.61928 21.92025 21.98503
3 21.06812 20.52647 20.72076 20.79732 21.38957
4 18.95485 19.70027 18.39504 20.20218 19.79887
5 22.75966 22.32306 22.32936 22.39271 22.84204

> dim(samples_pheno)
[1] 66 24

> samples_pheno[1:3,1:3]
Trial Number  Trial Sample
1027      222       A   1027
1075      223       A   1075
1116      224       A   1116

> proteins_combat = ComBat(dat= as.matrix(log_proteins_norm_sorted), batch=samples_pheno$Batch , par.prior = T) Found10batches Adjusting for0covariate(s) or covariate level(s) Standardizing Data across genes Fitting L/S model and finding priors Finding parametric adjustments Adjusting the Data  So as you can see, this works. However, when I subset some of the samples and reduce the sample number from 66 to 55 and run comBat, I get the following: > dim(log_proteins_MRD_sorted) [1] 5415 55 > log_proteins_MRD_sorted[1:5,1:5] 1027 1075 1116 1119 1217 1 22.55492 20.69292 21.61162 22.06435 21.86900 2 21.72926 20.95974 21.66907 21.97005 21.35203 3 21.11791 20.57627 20.77055 20.84712 21.01896 4 19.00465 19.75006 18.44483 20.25198 18.95107 5 22.80946 22.37285 22.37915 22.44250 22.50524 > dim(samples_pheno3) [1] 55 24 > samples_pheno3[1:3,1:3] Trial Number Trial Sample 1027 222 A 1027 1075 223 A 1075 1116 224 A 1116 > proteins_combat_MRD = ComBat(dat= as.matrix(log_proteins_MRD_sorted), batch=samples_pheno3$Batch ,  par.prior = T)
Error in apply(dat[, batch == batch_level], 1, function(x) { :
dim(X) must have a positive length


In case you wanted to know, I am working with the same original file for log_proteins_MRD_sorted and log_proteins_norm_sorted. I just removed the 11 samples from the 66 samples and then normalised the data again (hence slight difference in values between the two objects.

For samples_pheno3, I run this code:

> #Subset the phenotype data to those samples with only MRD data
> samples_pheno2 <- samples_pheno[-c(5,6,11,16,21, 26, 29,30,32, 45,56),]
> MRD_NA1 <- rownames(samples_pheno2)[!is.na(samples_pheno2$MRD)] > samples_pheno3 <- samples_pheno2[MRD_NA1,]  Also this is out my data looks like for the batches: > samples_pheno3$Batch
[1] 7  5  6  9  7  7  7  7  8  8  8  8  9  9  9  9  10 10 10 10 11 11 11 2  7  2  2  2  9  3  3  3  3  3  3  3  7
[38] 10 3  4  10 4  4  8  4  4  4  5  5  5  8  11 5  5  5
Levels: 2 3 4 5 6 7 8 9 10 11


So just by subsetting the data to 55 samples, it doesn't seem to work for some reason. Is it the way I am subsetting the data which is confusing the code?

With the help of my very capable local bioinformatician, I have found a solution. Essentially, the problem was that when I reduced the sample size from 66 to 55, there was a batch number which only had 1 sample in it. When I removed that sample from the analysis, and ensured that each batch had at least 2 samples in it, the ComBat() then worked nicely!