first commit
[synclust.git] / R / main.utils.R
1 #various util functions for the main program
2
3 #preliminary: replace NA's by averaging over each serie's values
4 #TODO: find a better way to handle missing values
5 replaceNAs = function(M)
6 {
7 n = nrow(M)
8 m = ncol(M)
9 res = M
10 for (i in 1:n)
11 {
12 avg = mean(M[i,1:(m-2)] [!is.na(M[i,1:(m-2)])])
13 res[i,1:(m-2)] [is.na(M[i,1:(m-2)])] = avg
14 }
15 return (res)
16 }
17
18 #standardize matrix M (remove mean, divide by standard deviation)
19 standardize = function(M)
20 {
21 avgM = colMeans(M, na.rm = TRUE)
22 stdevs = sqrt( unlist( apply(M, 2, var, na.rm=TRUE) ) )
23 res = t(M) - avgM
24 res = t(res / stdevs)
25 return (list("M"=res,"avg"=avgM,"stv"=stdevs))
26 }
27
28 #opposite of the previous function: get back M from standardized form
29 destandardize = function(std)
30 {
31 M = std$M
32 M = t(M) * std$stv
33 M = t(M + std$avg)
34 return (M)
35 }
36
37 #remap neighbors into some connex component
38 remapNeighbors = function(NI, indices)
39 {
40 revIndices = rep(NA, length(NI))
41 nc = length(indices)
42 for (ii in 1:nc)
43 revIndices[ indices[ii] ] = ii
44 locNI = list("ix"=as.list(rep(NA,nc)), "ds"=as.list(rep(NA,nc)))
45 for (ii in 1:nc)
46 {
47 locNI$ix[[ii]] = revIndices[ NI$ix[[ indices[ii] ]] ]
48 locNI$ds[[ii]] = NI$ds[[ indices[ii] ]]
49 }
50 return (locNI)
51 }
52
53 #check graph connexity
54 getConnectedComponents = function(NIix)
55 {
56 return (.Call("getConnectedComponents", NIix));
57 }
58
59 #auxiliary function to display clustering information
60 promptForMapDisplay = function(stage, coordsM, NIix=NULL, clusters=NULL)
61 {
62 if (is.null(clusters))
63 clusters = rep(1, nrow(coordsM))
64
65 shouldDisplay = ""
66 if (stage == "interm")
67 shouldDisplay = readline(">>> show intermediate map of neighborhoods ? (y/n)\n")
68 else if (stage == "final")
69 {
70 shouldDisplay = readline(
71 ">>> show final map of clusters ? (y/n) \
72 NOTE: can be plotted later, see '? drawMapWithSites'\n")
73 }
74
75 if (shouldDisplay == "y")
76 {
77 drawMapWithSites(coordsM, clusters)
78 if (!is.null(NIix))
79 drawNeighborhoodGraph(coordsM,NIix)
80 print("Please press 'enter' to continue")
81 readline()
82 if (!is.null(dev.list()))
83 dev.off()
84 }
85 }