-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathanalysis_mixtvem.R
65 lines (57 loc) · 2.16 KB
/
analysis_mixtvem.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
source('MixTVEM.R')
data = generate_osa_data() %>%
.[, NormTime := (Time - min(Time)) / (max(Time) - min(Time))]
fitMixTvem = function(k) {
start = Sys.time()
if(k == 1) {
# needed to prevent consistent estimation errors for the single-group solution
y = ifelse(data$Usage == 0, rnorm(nrow(data), sd=.1), data$Usage)
} else {
y = data$Usage
}
model = TVEMMixNormal(dep=y,
id=data$Id,
numInteriorKnots=6,
deg=3,
doPlot=FALSE,
numClasses=k,
numStarts=20,
gridSize=365,
maxVarianceRatio=NA,
convergenceCriterion=1e-4,
getSEs=FALSE,
tcov=rep(1, nrow(data)),
time=data$NormTime)
model$runTime = Sys.time() - start
return(model)
}
computeMixTvemTrajectories = function(model) {
k = ncol(model$fittedValues)
times = model$timeGrid * (max(data$Time) - min(data$Time)) + min(data$Time)
data.table(model$betaByGrid[[1]], Time=times) %>%
setnames(paste0('V', 1:k), LETTERS[1:k]) %>%
melt(id.vars='Time', value.name='Usage', variable.name='Group')
}
# mixtvems = readRDS(file='save/mixtvems.rds')
mixtvems = list()
mixtvems[['1']] = fitMixTvem(1)
mixtvems[['2']] = fitMixTvem(2)
mixtvems[['3']] = fitMixTvem(3)
mixtvems[['4']] = fitMixTvem(4)
mixtvems[['5']] = fitMixTvem(5)
mixtvems[['6']] = fitMixTvem(6)
mixtvems[['7']] = fitMixTvem(7)
mixtvems[['8']] = fitMixTvem(8)
# saveRDS(mixtvems, file='save/mixtvems.rds')
# Solutions ####
plotMetric(sapply(mixtvems, function(m) m$bestFit$bic), as.integer(names(mixtvems)), 'BIC')
# ggsave('save/mixtvem_bic.pdf', width=bicPlotSize[1], height=bicPlotSize[2], units='cm')
# Assess the best solution ####
k = 4
bestMixTvem = mixtvems[[as.character(k)]]
pp = bestMixTvem$bestFit$postProbsBySub
groupProps = colMeans(pp) %T>% print()
computeMixTvemTrajectories(bestMixTvem) %>% plotGroupTrajectories(groupProps)
# ggsave('save/mixtvem_groups.pdf', width=groupPlotSize[1], height=groupPlotSize[2], units='cm')
relativeEntropy(pp)
confusionMatrix(pp) %>% {round(. * 100, .1)}