• FAO’s Voices of the Hungry (VoH) has developed a new global standard for estimating the prevalence of food insecurity using a tool called the Food Insecurity Experience Scale (FIES).

  • FIES is a matrix of food insecurity severity based on respondents’ direct answers to questions about their access to adequate food to assess their ability to access food.

1 Source Data

The FIES Survey Module (FIES-SM) consists of 8 questions about access to food. The questions in the FIES-SM focus on individuals’ behaviors and experiences related to increasing difficulties in accessing food due to limited resources.

Since the March 2021 Susenas survey, questions regarding Food Insecurity Experience have been included, adopting the 8 FIES questions from the FAO.

The eight questions are divided into three sections:

  1. The first section consists of the first 3 questions, which aim to measure light food insecurity.

  2. The second section consists of the next 3 questions, which aim to measure moderate food insecurity.

  3. The third section consists of the last 2 questions, which aim to measure severe food insecurity.

myfies23 <- as.data.frame(read.spss("KOR23_RT.sav", use.value.labels = FALSE))
myfies23[,10:17][myfies23[,10:17]==5] <- 0
myfies23[,10:17][myfies23[,10:17]==8] <- NA
myfies23[,10:17][myfies23[,10:17]==9] <- NA
myfies23 <- myfies23[complete.cases(myfies23[,10:17]),]

2 FIES Data Setup

At this stage, the set of FIES questions used is determined, along with the weights applied.

XX = subset(myfies23, select = c(10:17))
colnames(XX) = c("WORRIED", "HEALTHY", "FEWFOOD", "SKIPPED", "ATELESS",
                 "RUNOUT", "HUNGRY", "WHLDAY")

# Normalized weighting
wt <- myfies23$FWT
wt_normalized <- wt / sum(wt) * length(wt)

3 Rasch Model

The Rasch Model is an analytical approach used to test the validity and reliability of research instruments and to simultaneously assess the fit between persons and items.

Key Advantages of the Rasch Model:

  • Provides a linear scale with equal intervals.

  • Can estimate missing data values.

  • Produces replicable measurements.

  • Detects model misfit effectively.

Calibration in the Rasch Model involves three aspects simultaneously: the measurement scale, respondents (persons), and items. Instruments that are not calibrated risk generating invalid data. Bond and Fox (2007) noted that using the Rasch Model for instrument validation produces a more holistic understanding of the instrument and better aligns with the definition of measurement.

Model Fit Measures

FIES data is validated using the Rasch Item Response Theory (IRT) model to confirm that it provides reliable measurements of food insecurity. The model fit is evaluated using the following criteria:

  1. Infit Statistics

Infit statistics within the range of 0.7–1.3 are considered acceptable for items that fit the Rasch model.

  1. Residual Correlation

Residual correlations should be nonsignificant. Significant residual correlations indicate unexplained aspects of the data, suggesting that the model needs improvement or modification.

  1. Rasch Reliability

Rasch reliability values > 0.7 are sufficient to demonstrate that the instrument has an acceptable level of reliability. This indicates that the instrument can differentiate respondents into at least two distinct groups (Wright and Masters, 1982).

# Applied Rasch Model
Model_Rasch = RM.w(as.data.frame(XX), wt_normalized, country = "Indonesia", write.file = TRUE, max.it = 1000)
cbind("sev" = Model_Rasch$b, "infit" = Model_Rasch$infit)
##                sev     infit
## WORRIED -4.1297105 1.1008852
## HEALTHY -1.8114630 0.9984815
## FEWFOOD -1.5382972 0.7453144
## SKIPPED  1.1786261 0.9726733
## ATELESS -0.3754886 0.8594648
## RUNOUT   1.1233567 0.9290614
## HUNGRY   1.9869824 0.8440083
## WHLDAY   3.5696553 1.0284729
Model_Rasch$reliab.fl
## [1] 0.7879214

From the output above, it can be observed that the infit statistics for all 8 items are within the acceptable range of 0.7–1.3, and the reliability value is 0.7879 (which is > 0.7).

Check the correlation of residuals between questions

screeplot(prcomp(Model_Rasch$mat.res), type = "lines")

The plot above represents the residual correlation plot, showing a decreasing trend.

The decreasing results indicate that the residuals between the 8 questions are not related to each other.

Next, the residual distribution values for each question are presented.

residuals_rasch = Model_Rasch$mat.res
head(residuals_rasch)
##       WORRIED     HEALTHY     FEWFOOD      SKIPPED     ATELESS       RUNOUT
## 6  0.10671250  0.54821901  0.61458891 -0.039788856 -0.16390549 -0.041955005
## 12 0.10671250 -0.45178099  0.61458891 -0.039788856  0.83609451 -0.041955005
## 21 0.62107332 -0.05666023 -0.04370852 -0.003011074 -0.01408683 -0.003181634
## 23 0.01356614  0.12257463  0.15510552 -0.264673586  0.36998120  0.724430880
## 25 0.62107332 -0.05666023 -0.04370852 -0.003011074 -0.01408683 -0.003181634
## 31 0.10671250  0.54821901  0.61458891 -0.039788856 -0.16390549 -0.041955005
##          HUNGRY        WHLDAY
## 6  -0.018129434 -0.0037786767
## 12 -0.018129434 -0.0037786767
## 21 -0.001343947 -0.0002763759
## 23 -0.138217601 -0.0318963854
## 25 -0.001343947 -0.0002763759
## 31 -0.018129434 -0.0037786767

The residual correlation matrix is as follows:

library(eRm)
correlation_matrix <- cor(residuals_rasch)
print(correlation_matrix)
##            WORRIED     HEALTHY     FEWFOOD      SKIPPED      ATELESS
## WORRIED  1.0000000 -0.29924899 -0.44750923 -0.223054972 -0.372559097
## HEALTHY -0.2992490  1.00000000  0.03452666 -0.150874464 -0.224290007
## FEWFOOD -0.4475092  0.03452666  1.00000000 -0.080661705  0.044850368
## SKIPPED -0.2230550 -0.15087446 -0.08066171  1.000000000 -0.001339675
## ATELESS -0.3725591 -0.22429001  0.04485037 -0.001339675  1.000000000
## RUNOUT  -0.1979462 -0.17101185 -0.12716714 -0.078103171 -0.050248072
## HUNGRY  -0.1881605 -0.17256084 -0.12264730 -0.033118669 -0.029375060
## WHLDAY  -0.1214246 -0.11124632 -0.10377237 -0.025908902 -0.051238767
##              RUNOUT      HUNGRY      WHLDAY
## WORRIED -0.19794621 -0.18816046 -0.12142456
## HEALTHY -0.17101185 -0.17256084 -0.11124632
## FEWFOOD -0.12716714 -0.12264730 -0.10377237
## SKIPPED -0.07810317 -0.03311867 -0.02590890
## ATELESS -0.05024807 -0.02937506 -0.05123877
## RUNOUT   1.00000000  0.10383435  0.04057810
## HUNGRY   0.10383435  1.00000000  0.14507841
## WHLDAY   0.04057810  0.14507841  1.00000000

4 Adjusted FIES Score

At this stage, adjustments and calibration of the FIES score values are performed against global standard values, while also examining the resulting mean and standard deviation.

The limitation of using FIES is that it requires a minimum of 5 questions.

adj_b = (Model_Rasch$b - mean(Model_Rasch$b))/sd(Model_Rasch$b)*sd(fies.global.st)+
  mean(fies.global.st)
(common = which(abs(fies.global.st - adj_b) < tolerance))
## HEALTHY SKIPPED ATELESS  RUNOUT  HUNGRY  WHLDAY 
##       2       4       5       6       7       8

The output above indicates that, based on the adjusted FIES values, only questions 2, 4, 5, 6, 7, and 8 have values below the tolerance threshold (i.e., 0.35).

Conducting an adjusted FIES based on the questions used:

adj_fies = (fies.global.st - mean(fies.global.st[common]))/
  sd(fies.global.st[common])*sd(Model_Rasch$b[common]) + 
  mean(Model_Rasch$b[common])
mean(adj_fies[common]) - mean(Model_Rasch$b[common])
## [1] 0
sd(adj_fies[common])-sd(Model_Rasch$b[common])
## [1] 0

If a plot is made, it will appear as follows:

plot(Model_Rasch$b, adj_fies, 
     xlim = range(adj_fies) * c(1.8, 1.1), 
     ylim = range(adj_fies) * c(1.8, 1.1))
points(Model_Rasch$b[-common], adj_fies[-common], col = "red", pch = 16)
text(Model_Rasch$b, adj_fies, names(fies.global.st), cex = 0.5, pos = 3)
abline(0, 1)
title(main = "Plot Model Rasch", sub = Model_Rasch$country)
abline(v = adj_fies[c(5,8)], lty = 2)
abline(h = adj_fies[c(5,8)], lty = 2)

From the plot above, it appears that there are 2 questions that do not fit within the tolerance limits, namely worried and fewfood.

5 Calculating FIES

Calculating moderate and severe food insecurity.

P_mod = 1 - pnorm(adj_fies[5], mean = Model_Rasch$a, sd = Model_Rasch$se.a)
P_mod[1] = 0
P_sev = 1 - pnorm(adj_fies[8], mean= Model_Rasch$a, sd = Model_Rasch$se.a)

Prev_mod = t(P_mod)%*%Model_Rasch$wt.rs / sum(Model_Rasch$wt.rs)
Prev_sev = t(P_sev)%*%Model_Rasch$wt.rs / sum(Model_Rasch$wt.rs)
(FIES = Prev_mod*100)
##          [,1]
## [1,] 4.504715

FIES Indonesia 2023 = 4.5

This means 4.50% of the population is experiencing moderate or severe food insecurity in Indonesia 2023.

6 References

Bond, T. G., & Fox, C. M. (2007). Applying the Rasch model: Fundamental measurement in the human sciences (2nd ed.). Mahwah, NJ: Lawrence Erlbaum Associates.

Food and Agriculture Organization of the United Nations. (2017). The Food Insecurity Experience Scale: Measuring food insecurity through people’s experiences. Rome: FAO.

Wright, B. D., & Masters, G. N. (1982). Rating scale analysis: Rasch measurement. Chicago: MESA Press.


Directorate Welfare Statistics, BPS,