comparison execute_dwt_var_perClass.R @ 1:0c1388b563a8 draft default tip

"planemo upload for repository https://github.com/galaxyproject/tools-devteam/tree/master/tools/dwt_var_perclass commit f929353ffb0623f2218d7dec459c7da62f3b0d24"
author devteam
date Mon, 06 Jul 2020 18:12:51 +0000
parents
children
comparison
equal deleted inserted replaced
0:27c5c2979e32 1:0c1388b563a8
1 ######################################################################
2 ## plot power spectra, i.e. wavelet variance by class
3 ## add code to create null bands by permuting the original data series
4 ## get class of maximum significant variance per feature
5 ## generate plots and table matrix of variance including p-values
6 ######################################################################
7 library("wavethresh");
8 library("waveslim");
9
10 options(echo = FALSE)
11
12 ## normalize data
13 norm <- function(data) {
14 v <- (data - mean(data)) / sd(data);
15 if (sum(is.na(v)) >= 1) {
16 v <- data;
17 }
18 return(v);
19 }
20
21 dwt_var_permut_get_max <- function(data, names, outfile, filter = 4, bc = "symmetric", method = "kendall", wf = "haar", boundary = "reflection") {
22 max_var <- NULL;
23 matrix <- NULL;
24 title <- NULL;
25 final_pvalue <- NULL;
26 short_levels <- NULL;
27 scale <- NULL;
28
29 print(names);
30
31 par(mfcol = c(length(names), length(names)), mar = c(0, 0, 0, 0), oma = c(4, 3, 3, 2), xaxt = "s", cex = 1, las = 1);
32
33 short_levels <- wavethresh::wd(data[, 1], filter.number = filter, bc = bc)$nlevels;
34
35 title <- c("motif");
36 for (i in seq_len(short_levels)) {
37 title <- c(title, paste(i, "var", sep = "_"), paste(i, "pval", sep = "_"), paste(i, "test", sep = "_"));
38 }
39 print(title);
40
41 ## normalize the raw data
42 data <- apply(data, 2, norm);
43
44 for (i in seq_len(length(names))) {
45 for (j in seq_len(length(names))) {
46 temp <- NULL;
47 results <- NULL;
48 wave1_dwt <- NULL;
49 out <- NULL;
50
51 out <- vector(length = length(title));
52 temp <- vector(length = short_levels);
53
54 if (i != j) {
55 plot(temp, type = "n", axes = FALSE, xlab = NA, ylab = NA);
56 box(col = "grey");
57 grid(ny = 0, nx = NULL);
58 } else {
59
60 wave1_dwt <- waveslim::dwt(data[, i], wf = wf, short_levels, boundary = boundary);
61
62 temp_row <- (short_levels + 1) * -1;
63 temp_col <- 1;
64 temp <- waveslim::wave.variance(wave1_dwt)[temp_row, temp_col];
65
66 ##permutations code :
67 feature1 <- NULL;
68 null <- NULL;
69 var_25 <- NULL;
70 var_975 <- NULL;
71 med <- NULL;
72
73 feature1 <- data[, i];
74 for (k in seq_len(1000)) {
75 nk_1 <- NULL;
76 null_levels <- NULL;
77 var <- NULL;
78 null_wave1 <- NULL;
79
80 nk_1 <- sample(feature1, length(feature1), replace = FALSE);
81 null_levels <- wavethresh::wd(nk_1, filter.number = filter, bc = bc)$nlevels;
82 var <- vector(length = length(null_levels));
83 null_wave1 <- waveslim::dwt(nk_1, wf = wf, short_levels, boundary = boundary);
84 var <- waveslim::wave.variance(null_wave1)[-8, 1];
85 null <- rbind(null, var);
86 }
87 null <- apply(null, 2, sort, na.last = TRUE);
88 var_25 <- null[25, ];
89 var_975 <- null[975, ];
90 med <- (apply(null, 2, median, na.rm = TRUE));
91
92 ## plot
93 results <- cbind(temp, var_25, var_975);
94 matplot(results, type = "b", pch = "*", lty = 1, col = c(1, 2, 2), axes = F);
95
96 ## get pvalues by comparison to null distribution
97 out <- (names[i]);
98 for (m in seq_len(length(temp))) {
99 print(paste("scale", m, sep = " "));
100 print(paste("var", temp[m], sep = " "));
101 print(paste("med", med[m], sep = " "));
102 pv <- NULL;
103 tail <- NULL;
104 out <- c(out, format(temp[m], digits = 3));
105 if (temp[m] >= med[m]) {
106 ## R tail test
107 print("R");
108 tail <- "R";
109 pv <- (length(which(null[, m] >= temp[m]))) / (length(na.exclude(null[, m])));
110
111 } else {
112 ## L tail test
113 print("L");
114 tail <- "L";
115 pv <- (length(which(null[, m] <= temp[m]))) / (length(na.exclude(null[, m])));
116 }
117 out <- c(out, pv);
118 print(pv);
119 out <- c(out, tail);
120 ## get variances outside null bands by comparing temp to null
121 ### temp stores variance for each scale, and null stores permuted variances for null bands
122 if (temp[m] <= var_975[m]) {
123 temp[m] <- NA;
124 }
125 }
126 final_pvalue <- rbind(final_pvalue, out);
127 matrix <- rbind(matrix, temp)
128 }
129 ## labels
130 if (i == 1) {
131 mtext(names[j], side = 2, line = 0.5, las = 3, cex = 0.25);
132 }
133 if (j == 1) {
134 mtext(names[i], side = 3, line = 0.5, cex = 0.25);
135 }
136 if (j == length(names)) {
137 axis(1, at = (1:short_levels), las = 3, cex.axis = 0.5);
138 }
139 }
140 }
141 colnames(final_pvalue) <- title;
142
143 ## get maximum variance larger than expectation by comparison to null bands
144 varnames <- vector();
145 for (i in seq_len(length(names))) {
146 name1 <- paste(names[i], "var", sep = "_")
147 varnames <- c(varnames, name1)
148 }
149 rownames(matrix) <- varnames;
150 colnames(matrix) <- (1:short_levels);
151 max_var <- names;
152 scale <- vector(length = length(names));
153 for (x in seq_len(nrow(matrix))) {
154 if (length(which.max(matrix[x, ])) == 0) {
155 scale[x] <- NA;
156 } else{
157 scale[x] <- colnames(matrix)[which.max(matrix[x, ])];
158 }
159 }
160 max_var <- cbind(max_var, scale);
161 write.table(max_var, file = outfile, sep = "\t", quote = FALSE, row.names = FALSE, append = TRUE);
162 return(final_pvalue);
163 }
164
165 ## execute
166 ## read in data
167 args <- commandArgs(trailingOnly = TRUE)
168
169 data_test <- NULL;
170 data_test <- read.delim(args[1]);
171
172 count <- ncol(data_test)
173 print(paste("The number of columns in the input file is: ", count));
174
175 # check if the number of motifs is not a multiple of 12, and round up is so
176 if (count %% 12 != 0) {
177 print("the number of motifs is not a multiple of 12")
178 count2 <- ceiling(count / 12);
179 }else{
180 print("the number of motifs is a multiple of 12")
181 count2 <- count / 12
182 }
183 print(paste("There will be", count2, "subfiles"))
184
185 pdf(file = args[4], width = 11, height = 8);
186
187 ## loop to read and execute on all count2 subfiles
188 final <- NULL;
189 for (x in seq_len(count2)) {
190 sub <- NULL;
191 sub_names <- NULL;
192 a <- NULL;
193 b <- NULL;
194
195 a <- ((x - 1) * 12 + 1);
196 b <- x * 12;
197
198 if (x < count2) {
199 sub <- data_test[, +c(a:b)];
200 sub_names <- colnames(data_test)[a:b];
201 final <- rbind(final, dwt_var_permut_get_max(sub, sub_names, args[2]));
202 }
203 else{
204 sub <- data_test[, +c(a:ncol(data_test))];
205 sub_names <- colnames(data_test)[a:ncol(data_test)];
206 final <- rbind(final, dwt_var_permut_get_max(sub, sub_names, args[2]));
207 }
208 }
209
210 dev.off();
211
212 write.table(final, file = args[3], sep = "\t", quote = FALSE, row.names = FALSE);