comparison Functions/density_pm.R @ 0:1535ffddeff4 draft

planemo upload commit a7ac27de550a07fd6a3e3ea3fb0de65f3a10a0e6-dirty
author cristian
date Thu, 07 Sep 2017 08:51:57 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:1535ffddeff4
1 ### Auxiliary functions ###
2
3 # Finds the peak
4 peaks <- function(x,partial=TRUE){
5 if (partial){ #includes the first and the last element
6 which(diff(c(TRUE,diff(x)>=0,FALSE))<0)
7 }else {
8 which(diff(diff(x)>=0)<0)+1
9 }
10 }
11
12
13 #Function that finds the valleys
14 valleys <- function(x,partial=TRUE){
15 if (partial){ #includes the first and the last element
16 which(diff(c(FALSE,diff(x)>0,TRUE))>0)
17 }else {
18 which(diff(diff(x)>0)>0)+1
19 }
20 }
21
22
23 #Function that calculates the probability masses
24 #ker: kernel density
25 #v: valleys
26 probability_mass <- function(ker,v){
27 require(sfsmisc, quietly = TRUE)
28 ker$y[which(ker$x<0)] = 0
29 pm = c()
30 for(j in 1:(length(v)-1)){
31 pm[j] = integrate.xy(ker$x,ker$y,ker$x[v[j]],ker$x[v[j+1]], use.spline = FALSE)
32 }
33 pm = pm/sum(pm)
34 return(pm)
35 }
36
37
38 #Function that tests if pm < value
39 #pm: probability masses
40 test_pm <- function(pm,value){
41 p = c()
42 num_pm = length(pm)
43 for(j in 1:num_pm){
44 if(pm[j]<value){
45 p = c(p,j)
46 }
47 }
48 return(p)
49 }
50
51
52
53 ### Main functions ###
54
55 # Estimate the kernel density and calculate the probability masses
56 # obs : data set
57 # num.points : number of points for the estimation of the kernel density
58 density_pm <- function(obs, num.points, p.bw = p.bw, threshold.modes = threshold.modes){
59
60 # fit model
61 ker = density(obs, bw = p.bw, n = num.points)
62
63 # find peaks
64 p = peaks(ker$y)
65
66 # find valleys
67 v = valleys(ker$y)
68
69 # probability masses
70 pm = probability_mass(ker,v)
71 num_pm = length(pm)
72
73 # number of pm < threshold.modes
74 p.del = test_pm(pm,threshold.modes)
75
76 # delete modes with probability masses < threshold.modes
77 for(j in 1:num_pm){
78 if(j %in% p.del){
79 p[j] = NA
80 v[j+1] = NA
81 }
82 }
83 p = p[!is.na(p)]
84 v = v[!is.na(v)]
85
86 # probability masses (without the ones < threshold.modes)
87 pm = probability_mass(ker,v)
88 num_pm = length(pm)
89
90 # number of pm<0.05
91 p5 = test_pm(pm,0.05)
92
93 # number of pm<0.10
94 p10 = test_pm(pm,0.10)
95
96 estimate = list(ker=ker,peaks=p,valleys=v,pm=pm,p5=p5,p10=p10)
97
98 return(estimate)
99 }
100
101
102
103 # Estimate the kernel density and calculate the probability masses, and do bootstrap
104 # obs : data set
105 # num.points : number of points for the estimation of the kernel density
106 density_pm_boot <- function(obs, num.points, p.bw = p.bw, threshold.modes = threshold.modes){
107
108 # fit model
109 ker = density(obs,bw = p.bw, n = num.points)
110
111 # find peaks
112 p = peaks(ker$y)
113
114 # find valleys
115 v = valleys(ker$y)
116
117 # probability masses
118 pm = probability_mass(ker, v)
119 num_pm = length(pm)
120
121 # number of pm < threshold.modes
122 p.del = test_pm(pm,threshold.modes)
123
124 # delete modes with probability masses < threshold.modes
125 for(j in 1:num_pm){
126 if(j %in% p.del){
127 p[j] = 0
128 v[j+1] = 0
129 }
130 }
131 p = p[! p == 0]
132 v = v[! v == 0]
133
134 # probability masses (without the ones < threshold.modes)
135 pm = probability_mass(ker,v)
136 num_pm = length(pm)
137
138 estimate = list(ker=ker,peaks=p,valleys=v,pm=pm)
139
140 return(estimate)
141 }