| Type: | Package |
| Title: | Fuzzy C-Means for Fuzzy Data |
| Version: | 0.1.2 |
| Description: | Implements a fuzzy clustering approach for ordinal Likert-type data using triangular fuzzy numbers (TFNs). The package extends the classical fuzzy C-means algorithm to better handle uncertainty in ordinal scales and includes automatic selection of the number of clusters using the Xie-Beni validity index. References: Coppi, R., D'Urso, P., and Giordani, P. (2012), "Fuzzy and possibilistic clustering for fuzzy data", <doi:10.1016/j.csda.2010.09.013>. Xie, X. L. and Beni, G. (1991), "A validity measure for fuzzy clustering", <doi:10.1109/34.85677>. |
| License: | MIT + file LICENSE |
| Encoding: | UTF-8 |
| LazyData: | true |
| Depends: | R (≥ 3.5) |
| Imports: | stats, graphics |
| Suggests: | knitr, rmarkdown, testthat (≥ 3.0.0) |
| VignetteBuilder: | knitr |
| Config/testthat/edition: | 3 |
| RoxygenNote: | 7.3.3 |
| NeedsCompilation: | no |
| Packaged: | 2026-07-05 04:17:36 UTC; pepeo |
| Author: | José Ortigas [aut, cre] |
| Maintainer: | José Ortigas <jose.ortigas@unmsm.edu.pe> |
| Repository: | CRAN |
| Date/Publication: | 2026-07-05 06:10:17 UTC |
Build Fuzzy Dictionary
Description
Constructs a fuzzy dictionary based on the selected scale type (symmetric or asymmetric).
Usage
build_dictionary(type, option, dictionary = NULL)
Arguments
type |
Character. Dictionary type ("symmetric" or "asymmetric"). |
option |
Character. Scale option ("A", "B", "C", or "D"). |
dictionary |
Optional matrix for asymmetric dictionaries. |
Details
For symmetric dictionaries, predefined TFN structures are generated. For asymmetric dictionaries, user-defined matrices are validated and converted to list format.
Value
A list representing the fuzzy dictionary.
Check Convergence of Membership Matrix
Description
Evaluates convergence based on the Frobenius norm between two membership matrices.
Usage
check_convergence(U_old, U_new, epsilon = 1e-06)
Arguments
U_old |
Previous membership matrix. |
U_new |
Updated membership matrix. |
epsilon |
Convergence tolerance. |
Value
Logical value indicating convergence.
Hard Cluster Assignment
Description
Assigns each observation to the cluster with the highest membership value.
Usage
cluster_assignment(object)
Arguments
object |
An object of class "fcmTFN". |
Value
A factor indicating cluster labels.
Cluster Sizes
Description
Computes the size of each cluster using both hard assignments and fuzzy memberships.
Usage
cluster_size(object)
Arguments
object |
An object of class "fcmTFN". |
Details
Hard size is obtained by assigning each observation to the cluster with the highest membership degree.
Fuzzy size is computed as the sum of membership degrees for each cluster.
Value
A data.frame containing:
- Cluster
Cluster label.
- Hard_Size
Number of observations assigned to the cluster.
- Fuzzy_Size
Sum of membership degrees.
Compute Cluster Prototypes
Description
Computes fuzzy cluster prototypes (centroids) using membership degrees and triangular fuzzy numbers.
Usage
compute_prototypes(fuzzy_data, U, m = 2)
Arguments
fuzzy_data |
A list of TFN matrices. |
U |
Membership matrix. |
m |
Numeric. Fuzzifier parameter (default = 2). |
Details
Each prototype is calculated as a weighted average of fuzzy observations using membership degrees raised to the fuzzifier parameter m.
Value
A list of prototype matrices.
Compute Adaptive Weights
Description
Computes adaptive weights for modal (wc) and spread (ws) components based on fuzzy distances and membership degrees.
Usage
compute_weights(fuzzy_data, prototypes, U, m = 2)
Arguments
fuzzy_data |
List of TFN matrices. |
prototypes |
List of prototype matrices. |
U |
Membership matrix. |
m |
Fuzzifier parameter. |
Value
A list with wc and ws.
Compute Xie-Beni Cluster Validity Index
Description
Computes the Xie-Beni (XB) index used to evaluate the compactness and separation of fuzzy clusters.
Usage
compute_xie_beni_index(fuzzy_data, U, prototypes, wc, ws, m = 2)
Arguments
fuzzy_data |
List of triangular fuzzy numbers representing the dataset. |
U |
Membership matrix (n x k). |
prototypes |
List of cluster prototypes. |
wc |
Modal weight. |
ws |
Spread weight. |
m |
Fuzzifier parameter. |
Details
The Xie-Beni index is defined as:
XB =
\frac{
\sum_{i=1}^{n}
\sum_{g=1}^{k}
u_{ig}^{m} d^{2}(x_i, h_g)
}{
n \min_{g \ne g'}
d^{2}(h_g, h_{g'})
}
Lower values indicate better clustering performance.
Value
Numeric value representing the Xie-Beni index.
Convert Matrix to Dictionary List
Description
Converts a matrix representation of triangular fuzzy numbers (TFN) into a named list format used internally by the system.
Usage
convert_matrix_to_list(matrix)
Arguments
matrix |
A numeric matrix with columns (l, c, r). |
Details
The input matrix must contain three columns: (l, c, r), where: l = left spread c = modal value r = right spread
Value
A named list containing triangular fuzzy numbers.
Convert Data to Triangular Fuzzy Numbers (TFN)
Description
Converts ordinal data into triangular fuzzy numbers using the provided fuzzy dictionary.
Usage
convert_to_tfn(data, dictionary)
Arguments
data |
A data.frame or matrix containing ordinal values. |
dictionary |
A named list representing the fuzzy dictionary. |
Details
Each observation is transformed into a matrix where rows represent variables and columns correspond to (l, c, r) values.
Value
A list of matrices containing TFN representations.
Default Symmetric Fuzzy Dictionary
Description
Generates predefined symmetric triangular fuzzy number (TFN) dictionaries for ordinal Likert-type scales.
Usage
default_symmetric_dictionary(option = "A")
Arguments
option |
Character. Dictionary option ("A", "B", "C", or "D"). |
Details
Available options: A: 5-point scale B: 7-point scale C: 10-point scale (1–10) D: 11-point scale (0–10)
Value
A list containing triangular fuzzy numbers (l, c, r).
Fuzzy C-Means Clustering for Triangular Fuzzy Numbers
Description
Performs fuzzy clustering on ordinal Likert-type data represented as triangular fuzzy numbers (TFNs).
Usage
fcmTFN(
data,
type = "symmetric",
option = "B",
dictionary = NULL,
k_values = 2:6,
m = 2,
epsilon = 1e-06,
max_iter = 1000,
verbose = TRUE
)
Arguments
data |
A data.frame or matrix containing ordinal Likert-type responses. Rows represent observations (respondents) and columns represent variables (items or dimensions). All values must be integers within the range defined by the selected scale option. |
type |
A character string specifying the type of fuzzy dictionary to use. Must be one of "symmetric" for predefined symmetric triangular fuzzy numbers, or "asymmetric" for a user-defined custom dictionary. Defaults to "symmetric". |
option |
A character string indicating the Likert scale option. Must be one of "A" (5-point scale, 1–5), "B" (7-point scale, 1–7), "C" (10-point scale, 1–10), or "D" (11-point scale, 0–10). Defaults to "B". |
dictionary |
An optional numeric matrix with 3 columns (l, c, r) representing the lower bound, modal value, and upper bound of each triangular fuzzy number. Required when type = "asymmetric"; ignored when type = "symmetric". Defaults to NULL. |
k_values |
A numeric vector specifying the candidate numbers of clusters to evaluate. The algorithm runs independently for each value of k. Defaults to 2:6. |
m |
Fuzzifier parameter (m > 1) specifying the fuzzifier parameter, which controls the degree of membership overlap between clusters. Higher values produce softer partitions. Defaults to 2. |
epsilon |
A positive numeric value specifying the convergence tolerance. The algorithm stops when the change in the objective function between iterations falls below this threshold. Defaults to 1e-06. |
max_iter |
A positive integer specifying the maximum number of iterations allowed per run. If convergence is not reached within this limit, a warning is issued. Defaults to 1000. |
verbose |
A logical value. If TRUE, progress messages are printed to the console during execution, including iteration count and convergence status for each value of k. Defaults to TRUE. |
Details
The function automatically determines the optimal number of clusters based on the Xie-Beni validity index.
Value
An object of class '"fcmTFN"' and '"fcm"'.
References
Coppi, R., D'Urso, P., & Giordani, P. (2012). Fuzzy and possibilistic clustering for fuzzy data. <doi:10.1016/j.csda.2010.09.013>
Xie, X. L., & Beni, G. (1991). A validity measure for fuzzy clustering. <doi:10.1109/34.85677>
Fuzzy K-Means for TFN Data
Description
Core iterative algorithm for fuzzy clustering using triangular fuzzy numbers.
Usage
fkm_f_algorithm(fuzzy_data, k, m = 2, epsilon = 1e-06, max_iter = 1000)
Arguments
fuzzy_data |
List of TFN matrices. |
k |
Number of clusters. |
m |
Fuzzifier parameter. |
epsilon |
Convergence tolerance. |
max_iter |
Maximum iterations. |
Value
List containing clustering results.
Compute Fuzzy Distance Between TFNs
Description
Computes the distance between two triangular fuzzy number (TFN) matrices using weighted Euclidean distance.
Usage
fuzzy_distance(x, h, wc, ws)
Arguments
x |
A TFN matrix (observation). |
h |
A TFN matrix (prototype). |
wc |
Numeric. Weight for modal component. |
ws |
Numeric. Weight for spread components. |
Details
The distance accounts for differences in modal values and spreads, controlled by weights wc and ws.
Value
A numeric distance value.
Initialize Membership Matrix
Description
Generates an initial fuzzy membership matrix (U) with random values and normalizes each row so that memberships sum to 1.
Usage
initialize_U(n, k)
Arguments
n |
Integer. Number of observations. |
k |
Integer. Number of clusters. |
Value
A numeric matrix of size n × k representing initial membership degrees.
Extract Membership Matrix
Description
Returns the fuzzy membership matrix obtained from the Fuzzy C-Means clustering process.
Usage
membership(object)
Arguments
object |
An object of class "fcmTFN". |
Value
A matrix where rows represent observations and columns represent clusters.
Membership Quality Assessment
Description
Evaluates the quality of fuzzy assignments for each cluster using membership-based measures.
Usage
membership_quality(object)
Arguments
object |
An object of class "fcmTFN". |
Details
This function computes both cluster-specific metrics based on hardened assignments (maximum membership rule) and global partition criteria to evaluate how well-defined the fuzzy boundaries are.
Value
A list containing:
- cluster_summary
-
Data frame with one row per cluster containing:
Hard_Size: number of observations primarily assigned to the cluster.
Avg_Membership: average membership of those observations.
Avg_Margin: average difference between the largest and second-largest memberships, indicating the clarity of assignment.
- partition_coefficient
-
Global partition coefficient (PC).
- partition_entropy
-
Global partition entropy (PE).
Plot Fuzzy Dictionary
Description
Plots the triangular fuzzy numbers defining the Likert-scale dictionary.
Usage
plot_dictionary(object, show_title = TRUE, ...)
Arguments
object |
An object of class "fcmTFN". |
show_title |
Logical. If TRUE (default), displays the plot title. |
... |
Additional graphical parameters. |
Value
Invisibly returns NULL.
Plot Cluster Prototypes
Description
Visualizes cluster prototypes as interval plots using triangular fuzzy numbers (l, c, r).
Usage
plot_prototypes(
object,
cluster = 1,
view = c("single", "global"),
use_var_names = FALSE,
var_names = NULL,
show_title = TRUE,
...
)
Arguments
object |
An object of class "fcmTFN". |
cluster |
Integer cluster to plot when view = "single". |
view |
Character string indicating the visualization mode. Either "single" or "global". |
use_var_names |
Logical. |
var_names |
Optional character vector of variable names. |
show_title |
Logical. If TRUE (default), displays the plot title. |
... |
Additional graphical parameters. |
Value
Invisibly returns NULL.
Plot Xie-Beni Index
Description
Plots the Xie-Beni validity index across candidate numbers of clusters.
Usage
plot_xb(object, mark_optimal = TRUE, type = "b", show_title = TRUE, ...)
Arguments
object |
An object of class "fcmTFN". |
mark_optimal |
Logical. Whether to highlight the optimal k. |
type |
Character string indicating the plotting style (default = "b"). |
show_title |
Logical. If TRUE (default), displays the plot title. |
... |
Additional graphical parameters. |
Value
Invisibly returns NULL.
Prepare Input System
Description
Prepares and validates all input components required for fuzzy clustering analysis.
Usage
prepare_input_system(data, type = "symmetric", option = "A", dictionary = NULL)
Arguments
data |
A data.frame or matrix containing ordinal values. |
type |
Character. Dictionary type ("symmetric" or "asymmetric"). |
option |
Character. Scale option ("A", "B", "C", or "D"). |
dictionary |
Optional matrix for asymmetric dictionaries. |
Details
The function performs the following steps: 1. Validates raw data 2. Builds fuzzy dictionary 3. Validates data values against dictionary 4. Converts data into triangular fuzzy numbers (TFN)
Value
A list containing processed system inputs.
Print Method for fcmTFN Objects
Description
Displays a concise summary of a fitted fuzzy C-means model using triangular fuzzy numbers.
Usage
print_fcmTFN(x, ...)
Arguments
x |
An object of class "fcmTFN". |
... |
Additional arguments (not used). |
Value
The input object (invisibly).
Prototype Results
Description
Returns cluster prototypes either as a flat matrix or as a list of tables containing l, c, r values for each variable.
Usage
prototype_results(
object,
use_var_names = FALSE,
var_names = NULL,
format = c("flat", "table")
)
Arguments
object |
An object of class "fcmTFN". |
use_var_names |
Logical. |
var_names |
Optional variable names. |
format |
Character string indicating the output format: "flat" (default) returns the original matrix representation, while "table" returns one table per cluster. |
Value
If format = "flat", a data.frame containing prototype values.
If format = "table", a named list of data.frames, one for each cluster.
Select Optimal Number of Clusters
Description
Runs the fuzzy clustering algorithm for multiple candidate values of k and selects the optimal one using the Xie-Beni index.
Usage
select_optimal_k(
fuzzy_data,
k_values,
m = 2,
epsilon = 1e-06,
max_iter = 100,
verbose = TRUE
)
Arguments
fuzzy_data |
List of TFN matrices. |
k_values |
Numeric vector of candidate cluster numbers. |
m |
Fuzzifier parameter. |
epsilon |
Convergence tolerance. |
max_iter |
Maximum number of iterations. |
verbose |
Logical; if TRUE, prints progress messages. |
Value
A list containing:
best_k Optimal number of clusters
xb_values Xie-Beni values
results List of clustering results
Simulated Likert 1–7 Survey Dataset
Description
A simulated Likert-type dataset with three well-separated clusters, specifically designed for testing fuzzy clustering of ordinal data.
Usage
sim_likert7
Format
A data frame with 300 rows and 12 variables:
- Q1
Simulated survey response measured on a 1–7 Likert scale.
- Q10
Simulated survey response measured on a 1–7 Likert scale.
- Q11
Simulated survey response measured on a 1–7 Likert scale.
- Q12
Simulated survey response measured on a 1–7 Likert scale.
- Q2
Simulated survey response measured on a 1–7 Likert scale.
- Q3
Simulated survey response measured on a 1–7 Likert scale.
- Q4
Simulated survey response measured on a 1–7 Likert scale.
- Q5
Simulated survey response measured on a 1–7 Likert scale.
- Q6
Simulated survey response measured on a 1–7 Likert scale.
- Q7
Simulated survey response measured on a 1–7 Likert scale.
- Q8
Simulated survey response measured on a 1–7 Likert scale.
- Q9
Simulated survey response measured on a 1–7 Likert scale.
Details
The dataset contains 300 observations divided into three distinct clusters of 100 observations each. Data generation was based on three latent profiles centered approximately at:
-
Low agreement:
\approx2 -
Moderate agreement:
\approx4 -
High agreement:
\approx6
Source
Simulated data generated for package examples.
Student Wellbeing During COVID-19
Description
Survey data on subjective well-being, optimism, gratitude, emotional closeness, worry, and depression, collected from university students.
Usage
students_wellbeing
Format
A data frame with 651 rows and 9 variables:
| Q13.1 | Satisfaction with life overall. |
| Q13.2 | Satisfaction with life at the present moment. |
| Q13.3 | Satisfaction with oneself. |
| Q13.4 | Satisfaction with physical appearance. |
| Q13.5 | Satisfaction with ability to communicate with others. |
| Q13.6 | Satisfaction with overall health. |
| Q13.7 | Satisfaction with achievements in life so far. |
| Q13.8 | Satisfaction with the college. |
| Q13.9 | Satisfaction with college classmates. |
Details
All variables are measured on an 11-point ordinal scale ranging from 0 to 10, where higher values indicate greater satisfaction.
Source
Martinez, L., Valencia, I., Trofimoff, V., & Valenzuela, L. S. (2020). Students wellbeing during COVID-19. <doi:10.17632/w9brygpwg7.2>
Summary for fcmTFN Objects
Description
Displays a summary of the Fuzzy C-Means clustering results for triangular fuzzy numbers.
Usage
## S3 method for class 'fcmTFN'
summary(object, ...)
Arguments
object |
An object of class "fcmTFN". |
... |
Additional arguments (not used). |
Value
Prints a formatted summary of the clustering result.
Update Membership Matrix
Description
Updates the fuzzy membership matrix (U) based on distances between observations and cluster prototypes.
Usage
update_membership(fuzzy_data, prototypes, wc, ws, m = 2)
Arguments
fuzzy_data |
List of TFN matrices. |
prototypes |
List of cluster prototypes. |
wc |
Modal weight. |
ws |
Spread weight. |
m |
Fuzzifier parameter. |
Value
Updated membership matrix U.
Validate Asymmetric Fuzzy Dictionary
Description
Validates a user-defined asymmetric triangular fuzzy number (TFN) dictionary to ensure structural consistency with the selected scale.
Usage
validate_asymmetric_dictionary(matrix, option)
Arguments
matrix |
A numeric matrix with columns (l, c, r). |
option |
Character. Scale option ("A", "B", "C", or "D"). |
Details
The function verifies: - Object type (matrix) - Number of columns (l, c, r) - Number of rows according to selected option - Valid modal values - Logical ordering (l <= c <= r) - Value bounds within allowed scale limits
Value
Invisibly returns TRUE if validation passes.
Validate Input Data
Description
Checks that the input data object is valid for fuzzy clustering analysis.
Usage
validate_data(data)
Arguments
data |
A data.frame or matrix. |
Details
The function verifies: - Object type (data.frame or matrix) - Non-zero dimensions - Absence of missing values
Value
Invisibly returns TRUE if validation passes.
Validate Data Values Against Dictionary
Description
Checks that all values in the input data are present in the fuzzy dictionary modes.
Usage
validate_data_values(data, dictionary)
Arguments
data |
A data.frame or matrix containing ordinal values. |
dictionary |
A named list representing the fuzzy dictionary. |
Details
The function verifies that every unique value in the dataset matches a valid dictionary key.
Value
Invisibly returns TRUE if validation passes.