# On evaluations of linguistic questionnaires

    library(FuzzySTs)

## `adjusted.weight.SI()`: Calculates the adjusted weight for a given sub-item of a linguistic questionnaire

For a given observation, `FuzzySTs::adjusted.weight.SI()` calculates the adjusted weight of a sub-item of a linguistic questionnaire when non-response is present. This function re-distributes the weights on the non-missing answers. Counting the answers in a given sub-item can be done based on the functions `FuzzySTs::delta_jki()` and `FuzzySTs::Delta_jki()`. This function returns a numerical value giving the re-adjusted weight of the sub-item k of the considered main-item for the observation i.

    # Simple example
    data <- matrix(c(3,4,2,3,3,2,4,3,3,4,3,4,4,2,5,3,4,4,3,3,3,4,4,3,
    3,3,4,3,3,3,3,4,4,3,5,3,4,3,3,3), ncol = 4)
    adjusted.weight.SI(data, 7, 1, c(0.5,0.5))
    #> [1] 0.5

## `adjusted.weight.MI()`: Calculates the adjusted weight for a given main-item of a linguistic questionnaire

When non-response is present, `FuzzySTs::adjusted.weight.MI()` calculates the adjusted weight given to a main-item of a linguistic questionnaire related to a particular observation. This function re-distributes the weights based on the missing answers occuring in a given main-item. The calculation of the readjusted weight in a sub-item is done using the function `FuzzySTs::adjusted.weight.SI()`. For the inputs of this function, a decomposition by main-items and sub-items similar to the one described using the function `FuzzySTs::FUZZ()` or the function `FuzzySTs::IND.EVAL()` is needed. We remind that the membership functions should be called “MF” attached to the index of the main-item followed by the one of the sub-item i.e. the variable, and finally the index of the linguistic term. This function returns a numerical value giving the re-adjusted weight of the main-item j for the observation i.

    # Calculation of a re-adjusted weight of the main-item 1 for the observation 9
    data <- matrix(c(3,4,2,3,3,2,4,3,3,4,3,4,4,2,5,3,4,4,3,3,3,4,4,3,
    3,3,4,3,3,3,3,4,4,3,5,3,4,3,3,3), ncol = 4)
    data <- as.data.frame(data)
    MI <- 2 # main-items
    SI1 <- 2
    SI2 <- 2
    SI <- c(SI1,SI2) # decomposition by sub-items
    b_j <- c(1/2,1/2) # weights of main-items
    b_jk <- matrix(c(0.5,0.5,0.5,0.5),nrow=2) # weights of sub-items by main-items
    PA11 <- c(1,2,3,4,5) # possible answers for the sub-item 1 of the main-item 1
    PA12 <- c(1,2,3,4,5) # possible answers for the sub-item 2 of the main-item 1
    PA21 <- c(1,2,3,4,5) # possible answers for the sub-item 1 of the main-item 2
    PA22 <- c(1,2,3,4,5) # possible answers for the sub-item 2 of the main-item 2

    # Fuzzification step
    # ------------------
    MF111 <- TrapezoidalFuzzyNumber(0,2,2,7)
    MF112 <- TrapezoidalFuzzyNumber(2,7,7,15)
    MF113 <- TrapezoidalFuzzyNumber(7,15,15,23)
    MF114 <- TrapezoidalFuzzyNumber(15,23,23,28)
    MF115 <- TrapezoidalFuzzyNumber(23,28,28,30)
    MF11 <- GFUZZ(data, 1, 1, PA11, spec="Identical", breakpoints = 100)
    # ------------------
    MF121 <- TrapezoidalFuzzyNumber(0,2,2,7)
    MF122 <- TrapezoidalFuzzyNumber(2,7,7,15)
    MF123 <- TrapezoidalFuzzyNumber(7,15,15,23)
    MF124 <- TrapezoidalFuzzyNumber(15,23,23,28)
    MF125 <- TrapezoidalFuzzyNumber(23,28,28,30)
    MF12 <- GFUZZ(data, 1, 2, PA12, spec="Identical", breakpoints = 100)
    # ------------------
    MF211 <- TrapezoidalFuzzyNumber(0,2,2,7)
    MF212 <- TrapezoidalFuzzyNumber(2,7,7,15)
    MF213 <- TrapezoidalFuzzyNumber(7,15,15,23)
    MF214 <- TrapezoidalFuzzyNumber(15,23,23,28)
    MF215 <- TrapezoidalFuzzyNumber(23,28,28,30)
    MF21 <- GFUZZ(data, 2, 1, PA21, spec="Identical", breakpoints = 100)
    # ------------------
    MF221 <- TrapezoidalFuzzyNumber(0,2,2,7)
    MF222 <- TrapezoidalFuzzyNumber(2,7,7,15)
    MF223 <- TrapezoidalFuzzyNumber(7,15,15,23)
    MF224 <- TrapezoidalFuzzyNumber(15,23,23,28)
    MF225 <- TrapezoidalFuzzyNumber(23,28,28,30)
    MF22 <- GFUZZ(data, 2, 2, PA22, spec="Identical", breakpoints = 100)
    # ------------------

    range <- matrix(c(0,0,0,0,28,28,28,28), ncol=2)
    adjusted.weight.MI(data, 9, 1, b_j, b_jk, SI)
    #> [1] 0.5

## `IND.EVAL()`: Calculates the individual evaluations of a linguistic questionnaire

`FuzzySTs::IND.EVAL()` calculates the individual evaluations of a linguistic questionnaire. The user has to define the data set to be evaluated, and the decomposition of the linguistic questionnaire by main and sub-items. The related initial weights have to be defined as well. In addition, a distance has to be chosen from the family of distances used by the function `FuzzySTs::distance()`. Finally, the fuzzy numbers modelling the different linguistic terms should be given. The computations can be made using all types of fuzzy numbers. We add that the argument `spec = "Identical"` refers to the fact that every linguistic \(L_{q}\) will be modelled by the identical fuzzy number across all the observations of the concerned variable. For the syntax to be used, each fuzzy linguistic should be called “MF” attached to the index of its main-item, followed by the index of its sub-item, and the one of the linguistic term, as explained in the description of the function `FuzzySTs::FUZZ()`. Let us recall the detailed decomposition of the modelling schema of the example of `FuzzySTs::FUZZ()`:

Consider a data set composed by 5 linguistic variables. We expose the needed decomposition in main and sub-items. We propose to divide the data set into \(2\) main-items as given in the following table. For each linguistic term of the considered variable, one has to choose a corresponding modelling fuzzy number. Suppose we want to model the linguistic \(L_{213}\), i.e. the third linguistic term of the first variable found in the second main-item, by a fuzzy number written as \(\tilde{L}_{213}\). Its membership function should then be expressed by MF213 as follows:

Decomposition 1 |  |  |  |  |  |  |  |  |
--- | --- | --- | --- | --- | --- | --- | --- | --- | ---
Main-item ({mi=1}) |  |  |  |  | Main-item ({mi=2}) |  |  |  |
Sub-item 1 |  | Sub-item 2 |  | Sub-item 3 |  | Sub-item 1 |  | Sub-item 2 |
si=1 |  | si=2 |  | si=3 |  | si=1 |  | si=2 |
\(\tilde{L}_{111}\) | MF111 | \(\tilde{L}_{121}\) | MF121 | \(\tilde{L}_{131}\) | MF131 | \(\tilde{L}_{211}\) | MF211 | \(\tilde{L}_{221}\) | MF221
\(\tilde{L}_{112}\) | MF112 | \(\tilde{L}_{122}\) | MF122 | \(\tilde{L}_{132}\) | MF132 | \(\tilde{L}_{212}\) | MF212 | \(\tilde{L}_{222}\) | MF222
\(\tilde{L}_{113}\) | MF113 | \(\tilde{L}_{123}\) | MF123 | \(\tilde{L}_{133}\) | MF133 | \(\tilde{L}_{213}\) | MF213 |  |
\(\tilde{L}_{114}\) | MF114 |  |  | \(\tilde{L}_{134}\) | MF134 | \(\tilde{L}_{214}\) | MF214 |  |

If the decomposition in main and sub-items is not required, it is then recommended to fix the index of the main-item to \(1\). Consequently, the index of the sub-item will be nothing but the column position of the variable in the architecture of the data set. For the same example previously described where the fourth variable has to be modelled by fuzzy numbers, suppose that no decomposition is desired, then the architecture becomes as seen in the following table. Therefore, the considered linguistic term \(L_{213}\) of the previous example is now on called \(L_{143}\) with its corresponding fuzzy number \(\tilde{L}_{143}\). Its membership function will afterwards be denoted by MF143 as given by:

Decomposition 2 |  |  |  |  |  |  |  |  |
--- | --- | --- | --- | --- | --- | --- | --- | --- | ---
Main-item ({mi=1}) |  |  |  |  |  |  |  |  |
Sub-item 1 |  | Sub-item 2 |  | Sub-item 3 |  | Sub-item 4 |  | Sub-item 5 |
si=1 |  | si=2 |  | si=3 |  | si=4 |  | si=5 |
\(\tilde{L}_{111}\) | MF111 | \(\tilde{L}_{121}\) | MF121 | \(\tilde{L}_{131}\) | MF131 | \(\tilde{L}_{141}\) | MF141 | \(\tilde{L}_{151}\) | MF151
\(\tilde{L}_{112}\) | MF112 | \(\tilde{L}_{122}\) | MF122 | \(\tilde{L}_{132}\) | MF132 | \(\tilde{L}_{142}\) | MF142 | \(\tilde{L}_{152}\) | MF152
\(\tilde{L}_{113}\) | MF113 | \(\tilde{L}_{123}\) | MF123 | \(\tilde{L}_{133}\) | MF133 | \(\tilde{L}_{143}\) | MF143 |  |
\(\tilde{L}_{114}\) | MF114 |  |  | \(\tilde{L}_{134}\) | MF134 | \(\tilde{L}_{144}\) | MF144 |  |

We have to mention that adding up the answers of a given linguistic are implemented as the functions `FuzzySTs::delta_jki` and `FuzzySTs::Delta_jki` respectively. In addition, if missingness occurs in the data set, we propose to readjust the weights of the main and sub-items. Practically, this task will be performed using the function `FuzzySTs::adjusted.weight.MI()` and `FuzzySTs::adjusted.weight.SI()`.

Finally, this function returns the data set of individual evaluations, for which the number of observations is exactly the same as the initial data set.

    # Calculation the individual evaluations of the following data set
    data <- matrix(c(3,4,2,3,3,2,4,3,3,4,3,4,4,2,5,3,4,4,3,3,3,4,4,3,
    3,3,4,3,3,3,3,4,4,3,5,3,4,3,3,3), ncol = 4)
    data <- as.data.frame(data)
    MI <- 2 # main-items
    SI1 <- 2
    SI2 <- 2
    SI <- c(SI1,SI2) # decomposition by sub-items
    b_j <- c(1/2,1/2) # weights of main-items
    b_jk <- matrix(c(0.5,0.5,0.5,0.5),nrow=2) # weights of sub-items by main-items
    PA11 <- c(1,2,3,4,5) # possible answers for the sub-item 1 of the main-item 1
    PA12 <- c(1,2,3,4,5) # possible answers for the sub-item 2 of the main-item 1
    PA21 <- c(1,2,3,4,5) # possible answers for the sub-item 1 of the main-item 2
    PA22 <- c(1,2,3,4,5) # possible answers for the sub-item 2 of the main-item 2

    # Fuzzification step
    # ------------------
    MF111 <- TrapezoidalFuzzyNumber(0,2,2,7)
    MF112 <- TrapezoidalFuzzyNumber(2,7,7,15)
    MF113 <- TrapezoidalFuzzyNumber(7,15,15,23)
    MF114 <- TrapezoidalFuzzyNumber(15,23,23,28)
    MF115 <- TrapezoidalFuzzyNumber(23,28,28,30)
    MF11 <- GFUZZ(data, 1, 1, PA11, spec="Identical", breakpoints = 100)
    # ------------------
    MF121 <- TrapezoidalFuzzyNumber(0,2,2,7)
    MF122 <- TrapezoidalFuzzyNumber(2,7,7,15)
    MF123 <- TrapezoidalFuzzyNumber(7,15,15,23)
    MF124 <- TrapezoidalFuzzyNumber(15,23,23,28)
    MF125 <- TrapezoidalFuzzyNumber(23,28,28,30)
    MF12 <- GFUZZ(data, 1, 2, PA12, spec="Identical", breakpoints = 100)
    # ------------------
    MF211 <- TrapezoidalFuzzyNumber(0,2,2,7)
    MF212 <- TrapezoidalFuzzyNumber(2,7,7,15)
    MF213 <- TrapezoidalFuzzyNumber(7,15,15,23)
    MF214 <- TrapezoidalFuzzyNumber(15,23,23,28)
    MF215 <- TrapezoidalFuzzyNumber(23,28,28,30)
    MF21 <- GFUZZ(data, 2, 1, PA21, spec="Identical", breakpoints = 100)
    # ------------------
    MF221 <- TrapezoidalFuzzyNumber(0,2,2,7)
    MF222 <- TrapezoidalFuzzyNumber(2,7,7,15)
    MF223 <- TrapezoidalFuzzyNumber(7,15,15,23)
    MF224 <- TrapezoidalFuzzyNumber(15,23,23,28)
    MF225 <- TrapezoidalFuzzyNumber(23,28,28,30)
    MF22 <- GFUZZ(data, 2, 2, PA22, spec="Identical", breakpoints = 100)
    # ------------------

    range <- matrix(c(0,0,0,0,28,28,28,28), ncol=2)
    ind.eval <- IND.EVAL(data,MI,b_j,SI,b_jk, range = range, distance.type ="DSGD.G")
    head(ind.eval)
    #> [1] 15.52417 22.48611 18.96555 13.74410 21.41515 13.74410

## `GLOB.EVAL()`: Calculates the global evaluation of a linguistic questionnaire

`FuzzySTs::GLOB.EVAL()` calculates the global evaluation of a linguistic questionnaire. The arguments of this function, i.e. the decomposition by main and sub-items, are similar to the ones of the function `FuzzySTs::IND.EVAL()`.

We have to remind that under the assumption of non-missingness, the global evaluation is the weighted mean of the set of individual evaluations resulting from the function `FuzzySTs::IND.EVAL()`. Thus, one can get the global evaluation using the basic function `stats::Weighted.mean()`. Nevertheless, we introduce a function `FuzzySTs::GLOB.EVAL.mean (ind.eval, p_ind)` applied on the vector of individual evaluations called `ind.eval` with the vector of weights denoted by `p_ind`. We add that if no sampling weights are applied, the argument `p_ind` is set to be `p_ind=rep(1, length(ind.eval))`. Note that `FuzzySTs::GLOB.EVAL()` returns a numerical value representing the global evaluation of the linguistic questionnaire.

    # Calculation of the global evaluation of the following data set
    data <- matrix(c(3,4,2,3,3,2,4,3,3,4,3,4,4,2,5,3,4,4,3,3,3,4,4,3,
    3,3,4,3,3,3,3,4,4,3,5,3,4,3,3,3), ncol = 4)
    data <- as.data.frame(data)
    MI <- 2 # main-items
    SI1 <- 2
    SI2 <- 2
    SI <- c(SI1,SI2) # decomposition by sub-items
    b_j <- c(1/2,1/2) # weights of main-items
    b_jk <- matrix(c(0.5,0.5,0.5,0.5),nrow=2) # weights of sub-items by main-items
    PA11 <- c(1,2,3,4,5) # possible answers for the sub-item 1 of the main-item 1
    PA12 <- c(1,2,3,4,5) # possible answers for the sub-item 2 of the main-item 1
    PA21 <- c(1,2,3,4,5) # possible answers for the sub-item 1 of the main-item 2
    PA22 <- c(1,2,3,4,5) # possible answers for the sub-item 2 of the main-item 2

    # Fuzzification step
    # ------------------
    MF111 <- TrapezoidalFuzzyNumber(0,2,2,7)
    MF112 <- TrapezoidalFuzzyNumber(2,7,7,15)
    MF113 <- TrapezoidalFuzzyNumber(7,15,15,23)
    MF114 <- TrapezoidalFuzzyNumber(15,23,23,28)
    MF115 <- TrapezoidalFuzzyNumber(23,28,28,30)
    MF11 <- GFUZZ(data, 1, 1, PA11, spec="Identical", breakpoints = 100)
    # ------------------
    MF121 <- TrapezoidalFuzzyNumber(0,2,2,7)
    MF122 <- TrapezoidalFuzzyNumber(2,7,7,15)
    MF123 <- TrapezoidalFuzzyNumber(7,15,15,23)
    MF124 <- TrapezoidalFuzzyNumber(15,23,23,28)
    MF125 <- TrapezoidalFuzzyNumber(23,28,28,30)
    MF12 <- GFUZZ(data, 1, 2, PA12, spec="Identical", breakpoints = 100)
    # ------------------
    MF211 <- TrapezoidalFuzzyNumber(0,2,2,7)
    MF212 <- TrapezoidalFuzzyNumber(2,7,7,15)
    MF213 <- TrapezoidalFuzzyNumber(7,15,15,23)
    MF214 <- TrapezoidalFuzzyNumber(15,23,23,28)
    MF215 <- TrapezoidalFuzzyNumber(23,28,28,30)
    MF21 <- GFUZZ(data, 2, 1, PA21, spec="Identical", breakpoints = 100)
    # ------------------
    MF221 <- TrapezoidalFuzzyNumber(0,2,2,7)
    MF222 <- TrapezoidalFuzzyNumber(2,7,7,15)
    MF223 <- TrapezoidalFuzzyNumber(7,15,15,23)
    MF224 <- TrapezoidalFuzzyNumber(15,23,23,28)
    MF225 <- TrapezoidalFuzzyNumber(23,28,28,30)
    MF22 <- GFUZZ(data, 2, 2, PA22, spec="Identical", breakpoints = 100)
    # ------------------

    range <- matrix(c(0,0,0,0,28,28,28,28), ncol=2)
    ind.eval <- IND.EVAL(data,MI,b_j,SI,b_jk, range = range, distance.type ="DSGD.G")

    (GLOB <- GLOB.EVAL(data, MI, b_j, SI, b_jk, distance.type ="GSGD"))
    #> [1] 17.84188
    (GLOB.mean <- GLOB.EVAL.mean(ind.eval))
    #> [1] 17.84188

## `R()`: Calculates the indicator of information’s rate of the data base

`FuzzySTs::R()` calculates the indicator of information’s rate of the complete data base. This computation uses the functions `FuzzySTs::adjusted.weight.SI()` and `FuzzySTs::Delta_jki()`. The function `FuzzySTs::R()` returns a numerical value, interpreted as the more it tends to the value \(1\), the less the complete questionnaire contains missing values.

    # Calculation of the indicator of information's rate - complete data set
    data <- matrix(c(3,4,2,3,3,2,4,3,3,4,3,4,4,2,5,3,4,4,3,3,3,4,4,3,
    3,3,4,3,3,3,3,4,4,3,5,3,4,3,3,3), ncol = 4)
    data <- as.data.frame(data)
    p_ind <- c(0.1,0.05,0.05,0.2,0.1,0.05,0.1,0.1,0.2,0.05) # Observations' weights
    SI1 <- 2
    SI2 <- 2
    SI <- c(SI1,SI2)
    b_jk <- matrix(c(0.5,0.5,0.5,0.5),nrow=2)

    R(data, p_ind, b_jk, SI)
    #> [1] 1

## `Ri()`: Calculates the indicator of information’s rate of the data base for a given unit

`FuzzySTs::Ri()` calculates the indicator of information’s rate of the complete data base for a given unit. This computation uses the functions `FuzzySTs::adjusted.weight.SI()` and `FuzzySTs::Delta_jki()`. The function `FuzzySTs::Ri()` returns a numerical value related to a particular observation. This value is interpreted as the more it tends to the value \(1\), the less the complete questionnaire contains missing values.

    # Calculation of the indicator of information's rate for the unit 7
    data <- matrix(c(3,4,2,3,3,2,4,3,3,4,3,4,4,2,5,3,4,4,3,3,3,4,4,3,
    3,3,4,3,3,3,3,4,4,3,5,3,4,3,3,3), ncol = 4)
    data <- as.data.frame(data)
    SI1 <- 2
    SI2 <- 2
    SI <- c(SI1,SI2)
    b_jk <- matrix(c(0.5,0.5,0.5,0.5),nrow=2)

    Ri(data, 7, b_jk, SI)
    #> [1] 1