a b/R/radiomics_first.R
1
#' Calculate first order radiomic features on a 2D or 3D array
2
#'
3
#' @param data Any 2D or 3D image (as matrix or array) to calculate first-order features
4
#' @param features = first level radiomic features to calculate
5
#'
6
#' @return Values from selected features
7
#' @importFrom stats quantile sd
8
#' @export
9
radiomics_first <- function(data,
10
                       features = c('mean', 'sd', 'skew', 'kurtosis', 'min', 'q1', 'median', 'q3', 'max','energy', 'rms', 'uniformity', 'entropy')){
11
12
  # Clean up data
13
  data <- as.vector(data)
14
  data <- data[!is.na(data)]
15
16
  # Moments
17
  if('mean' %in% features){
18
    mean_value <- mean(data)
19
  }else(mean_value = NULL)
20
  if('sd' %in% features){
21
    sd_value <- sd(data)
22
  }else(sd_value = NULL)
23
  if('skew' %in% features){
24
    skew_value <- skew(data)
25
  }else(skew_value = NULL)
26
  if('kurtosis' %in% features){
27
    kurtosis_value <- kurtosis(data)
28
  }else(kurtosis_value = NULL)
29
30
31
  # Quartiles
32
  if('min' %in% features){
33
    min_value <- min(data)
34
  }else(min_value = NULL)
35
  if('q1' %in% features){
36
    q1_value <- unname(quantile(data, probs = 0.25))
37
  }else(q1_value = NULL)
38
  if('median' %in% features){
39
    median_value <- median(data)
40
  }else(median_value = NULL)
41
  if('q3' %in% features){
42
    q3_value <- unname(quantile(data, probs = 0.75))
43
  }else(q3_value = NULL)
44
  if('max' %in% features){
45
    max_value <- max(data)
46
  }else(max_value = NULL)
47
48
49
  # Others
50
  if('energy' %in% features){
51
    energy_value <- energy(data)
52
  }else(energy_value = NULL)
53
  if('rms' %in% features){
54
    rms_value <- rms(data)
55
  }else(rms_value = NULL)
56
  if('uniformity' %in% features){
57
    uniformity_value <- uniformity(data)
58
  }else(uniformity_value = NULL)
59
  if('entropy' %in% features){
60
    entropy_value <- entropy(data)
61
  }else(entropy_value = NULL)
62
63
64
  featuresList <- list(
65
    mean = mean_value,
66
    sd = sd_value,
67
    skew = skew_value,
68
    kurtosis = kurtosis_value,
69
    min = min_value,
70
    q1 = q1_value,
71
    median = median_value,
72
    q3 = q3_value,
73
    max = max_value,
74
    energy = energy_value,
75
    rms = rms_value,
76
    uniformity = uniformity_value,
77
    entropy = entropy_value
78
  )
79
  if(length(features)==1){
80
    featuresList = unlist(featuresList[features])
81
  }
82
83
  return(featuresList)
84
85
}
86
87
88
89
skew <- function(data) {
90
  avg <- mean(data)
91
  SD  <- stats::sd(data)
92
  output <- mean(((data-avg)^3))/(SD)^3
93
  return(output)
94
}
95
96
kurtosis <- function(data) {
97
  avg <- mean(data)
98
  SD  <- stats::sd(data)
99
  output <- mean(((data-avg)^4))/(SD)^4
100
  return(output-3)
101
}
102
103
energy <- function(data) {
104
  output <- sum(data^2)
105
  return(output)
106
}
107
108
rms <- function(data) {
109
  output <- sqrt(sum(data^2)/length(data))
110
  return(output)
111
}
112
113
uniformity <- function(data) {
114
  output <- sum((table(data)/length(data))^2)
115
  return(output)
116
}
117
118
entropy <- function (data, base = 2)
119
{
120
  p <- table(data)/length(data)
121
  l <- logb(p, base)
122
  H <- sum(p * l)*-1
123
  return(H)
124
}
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144