Measurement Properties of Urban Safety Perception Scales Among University Students in Kyiv

Analytical Code Report — Working Version

Author

Andrii Bova

Published

March 1, 2026

Abstract

Background. Fear of crime and urban safety perception are multidimensional constructs that require psychometrically sound measurement instruments. Despite their widespread use in criminological research, the factor structure and measurement properties of urban safety perception scales have rarely been examined in post-Soviet contexts.

Objectives. This study examines the measurement properties of four urban safety perception scales administered to university students in Kyiv: (1) perceived safety across locations, (2) fear and subjective risk of victimisation, (3) neighbourhood disorder, and (4) risk avoidance behaviour.

Method. Data were drawn from the survey Safety Situation in Kyiv — 2016 (N = 467 after listwise deletion; 512 students from five Kyiv universities, October–November 2016). The dimensional structure was first explored using Exploratory Graph Analysis (EGA; GLASSO, Walktrap algorithm). Confirmatory factor analysis (CFA) was then conducted for each scale and for an integrated eight-factor model using WLSMV estimation with robust standard errors, appropriate for ordinal indicators. Scale reliability was assessed via ordinal alpha, omega, and categorical composite reliability. Discriminant validity was evaluated using the HTMT₂ criterion.

Results. EGA identified four stable dimensions, replicated in 93.4% of 500 bootstrap samples (median = 4, 95% CI [3.51, 4.49]). CFA confirmed the hypothesised factor structures across all four scales. Individual-scale fit was acceptable to excellent: CFI(robust) ranged from .955 to .989, RMSEA(robust) from .067 to .080. The integrated eight-factor model showed adequate fit (CFI = .917, TLI = .903, RMSEA = .064). Composite reliability (ω) ranged from .698 (GRA) to .854 (FCV), and all HTMT₂ values fell below the .85 threshold, supporting discriminant validity across all factor pairs.

Conclusion. The four urban safety perception scales demonstrated adequate to good measurement properties in a Kyiv student sample. The findings support the use of these instruments in further research on fear of crime and safety perception in urban Ukrainian contexts.

Keywords

urban safety, safety perception, perceived safety, fear of crime, victimisation risk, neighbourhood disorder, avoidance behaviour, factor structure, scale validation, measurement properties, construct validity, reliability, confirmatory factor analysis, WLSMV, polychoric correlation, ordinal data, university students, Kyiv, Ukraine

▶ Show code
library(tibble)
library(knitr)
library(kableExtra)
library(dplyr)

# ── Response scales (bilingual) ───────────────────────────────────────
resp_safety <- "1 — Зовсім безпечно / *Completely safe*  
2 — Безпечно / *Safe*  
3 — Небезпечно / *Unsafe*  
4 — Зовсім небезпечно / *Completely unsafe*"

resp_fear <- "1 — Зовсім не боюся / *Not afraid at all*  
2 — Скоріше не боюся / *Rather not afraid*  
3 — Скоріше боюся / *Rather afraid*  
4 — Дуже боюся / *Very afraid*"

resp_risk <- "1 — Зовсім неймовірно / *Very unlikely*  
2 — Не дуже ймовірно / *Rather unlikely*  
3 — Ймовірно / *Likely*  
4 — Дуже ймовірно / *Very likely*"

resp_disorder <- "1 — Не проблема взагалі / *Not a problem at all*  
2 — Незначна проблема / *A minor problem*  
3 — Велика проблема / *A big problem*  
4 — Дуже велика проблема / *A very big problem*"

resp_bhv <- "1 — Майже ніколи / *Almost never*  
2 — Іноді / *Sometimes*  
3 — Часто / *Often*  
4 — Майже завжди / *Almost always*"

# ── Item table ────────────────────────────────────────────────────────
instruments <- tribble(
  ~Code,   ~Scale,                          ~Ukrainian_Formulation,                                                                                      ~English_Formulation,                                                                              ~Response_Scale,

  # ── Scale 1: Perceived Safety ───────────────────────────────────────
  "safd2", "Scale 1: Perceived Safety",
  "13. Наскільки безпечно Ви почуваєтесь на самоті у світлий час доби йдучи в районі, де Ви мешкаєте?",
  "13. How safe do you feel alone during daytime walking in the neighbourhood where you live?",
  resp_safety,

  "safd3", "Scale 1: Perceived Safety",
  "14. Наскільки безпечно Ви почуваєтесь на самоті у світлий час доби у магазинах, аптеках?",
  "14. How safe do you feel alone during daytime in shops and pharmacies?",
  resp_safety,

  "safd4", "Scale 1: Perceived Safety",
  "15. Наскільки безпечно Ви почуваєтесь на самоті у світлий час доби у місцях відпочинку, дозвілля, розваг?",
  "15. How safe do you feel alone during daytime in leisure and entertainment venues?",
  resp_safety,

  "safd5", "Scale 1: Perceived Safety",
  "16. Наскільки безпечно Ви почуваєтесь на самоті у світлий час доби користуючись громадським транспортом міста?",
  "16. How safe do you feel alone during daytime using public transport?",
  resp_safety,

  "safn2", "Scale 1: Perceived Safety",
  "18. Наскільки безпечно Ви почуваєтесь на самоті у темний час доби після 22 години йдучи в районі, де Ви мешкаєте?",
  "18. How safe do you feel alone at night (after 22:00) walking in the neighbourhood where you live?",
  resp_safety,

  "safn3", "Scale 1: Perceived Safety",
  "19. Наскільки безпечно Ви почуваєтесь на самоті у темний час доби після 22 години у магазинах, аптеках?",
  "19. How safe do you feel alone at night (after 22:00) in shops and pharmacies?",
  resp_safety,

  "safn4", "Scale 1: Perceived Safety",
  "20. Наскільки безпечно Ви почуваєтесь на самоті у темний час доби після 22 години у місцях відпочинку, дозвілля, розваг?",
  "20. How safe do you feel alone at night (after 22:00) in leisure and entertainment venues?",
  resp_safety,

  "safn5", "Scale 1: Perceived Safety",
  "21. Наскільки безпечно Ви почуваєтесь на самоті у темний час доби після 22 години користуючись громадським транспортом міста?",
  "21. How safe do you feel alone at night (after 22:00) using public transport?",
  resp_safety,

  # ── Scale 2: Fear of Victimisation ──────────────────────────────────
  "fcv1",  "Scale 2: Fear of Victimisation",
  "23. Наскільки Ви боїтеся … хтось здійснить крадіжку з Вашого помешкання?",
  "23. How afraid are you … that someone will burglarise your home?",
  resp_fear,

  "fcv3",  "Scale 2: Fear of Victimisation",
  "25. Наскільки Ви боїтеся … хтось нападе та застосує фізичну силу?",
  "25. How afraid are you … that someone will attack and use physical force against you?",
  resp_fear,

  "fcv4",  "Scale 2: Fear of Victimisation",
  "26. Наскільки Ви боїтеся … хтось відбере погрозою або силою якусь річ (телефон)?",
  "26. How afraid are you … that someone will rob you by threat or force (e.g. phone)?",
  resp_fear,

  "fcv5",  "Scale 2: Fear of Victimisation",
  "27. Наскільки Ви боїтеся … хтось поцупить особисті речі (у транспорті, на вулиці)?",
  "27. How afraid are you … that someone will steal your personal belongings (in transport or on the street)?",
  resp_fear,

  "fcv7",  "Scale 2: Fear of Victimisation",
  "29. Наскільки Ви боїтеся … хтось заволодіє майном чи грошима шляхом обману?",
  "29. How afraid are you … that someone will obtain your property or money through fraud?",
  resp_fear,

  # ── Scale 2 (cont.): Subjective Risk of Victimisation ───────────────
  "rcv1",  "Scale 2: Subjective Risk of Victimisation",
  "32. Як Ви оцінюєте потенційний ризик … хтось здійснить крадіжку з Вашого помешкання?",
  "32. How do you assess the potential risk … that someone will burglarise your home?",
  resp_risk,

  "rcv3",  "Scale 2: Subjective Risk of Victimisation",
  "34. Як Ви оцінюєте потенційний ризик … хтось нападе та застосує фізичну силу?",
  "34. How do you assess the potential risk … that someone will attack and use physical force?",
  resp_risk,

  "rcv4",  "Scale 2: Subjective Risk of Victimisation",
  "35. Як Ви оцінюєте потенційний ризик … хтось відбере погрозою або силою якусь річ (телефон)?",
  "35. How do you assess the potential risk … that someone will rob you by threat or force?",
  resp_risk,

  "rcv5",  "Scale 2: Subjective Risk of Victimisation",
  "36. Як Ви оцінюєте потенційний ризик … хтось поцупить особисті речі (у транспорті, на вулиці)?",
  "36. How do you assess the potential risk … that someone will steal your personal belongings?",
  resp_risk,

  "rcv7",  "Scale 2: Subjective Risk of Victimisation",
  "38. Як Ви оцінюєте потенційний ризик … хтось заволодіє майном чи грошима шляхом обману?",
  "38. How do you assess the potential risk … that someone will obtain your property through fraud?",
  resp_risk,

  # ── Scale 3: Neighbourhood Disorder ─────────────────────────────────
  "sp1",   "Scale 3: Neighbourhood Disorder",
  "41. Наскільки проблемою у районі є … галасливі сусіди або галасливі вечірки?",
  "41. To what extent is the following a problem in your neighbourhood … noisy neighbours or loud parties?",
  resp_disorder,

  "sp2",   "Scale 3: Neighbourhood Disorder",
  "42. Наскільки проблемою у районі є … вандалізм, пошкодження майна або автомобілів?",
  "42. … vandalism, damage to property or vehicles?",
  resp_disorder,

  "sp3",   "Scale 3: Neighbourhood Disorder",
  "43. Наскільки проблемою у районі є … люди, які вживають або поширюють наркотики?",
  "43. … people using or dealing drugs?",
  resp_disorder,

  "sp4",   "Scale 3: Neighbourhood Disorder",
  "44. Наскільки проблемою у районі є … хулігани та п'яниці у громадських місцях?",
  "44. … hooligans and drunk people in public places?",
  resp_disorder,

  "sp5",   "Scale 3: Neighbourhood Disorder",
  "45. Наскільки проблемою у районі є … вигул собак без намордників та повідків?",
  "45. … dogs walked without muzzles or leads?",
  resp_disorder,

  "sp6",   "Scale 3: Neighbourhood Disorder",
  "46. Наскільки проблемою у районі є … крадіжки з помешкань?",
  "46. … residential burglaries?",
  resp_disorder,

  "sp7",   "Scale 3: Neighbourhood Disorder",
  "47. Наскільки проблемою у районі є … крадіжки особистих речей (у транспорті, на вулиці)?",
  "47. … theft of personal belongings (in transport or on the street)?",
  resp_disorder,

  "sp8",   "Scale 3: Neighbourhood Disorder",
  "48. Наскільки проблемою у районі є … напади, побиття?",
  "48. … physical attacks and assault?",
  resp_disorder,

  "sp9",   "Scale 3: Neighbourhood Disorder",
  "49. Наскільки проблемою у районі є … агресивні водії, порушення правил дорожнього руху?",
  "49. … aggressive drivers and traffic violations?",
  resp_disorder,

  # ── Scale 4: Risk Avoidance Behaviour ───────────────────────────────
  "bhv1",  "Scale 4: Risk Avoidance Behaviour",
  "50. Як часто Ви ведете себе обачливо з незнайомими людьми?",
  "50. How often do you behave cautiously around strangers?",
  resp_bhv,

  "bhv2",  "Scale 4: Risk Avoidance Behaviour",
  "51. Як часто Ви тримаєтесь подалі від певних місць та зустрічей?",
  "51. How often do you avoid certain places and gatherings?",
  resp_bhv,

  "bhv3",  "Scale 4: Risk Avoidance Behaviour",
  "52. Як часто Ви уникаєте небезпечних побутових ситуацій?",
  "52. How often do you avoid dangerous everyday situations?",
  resp_bhv,

  "bhv4",  "Scale 4: Risk Avoidance Behaviour",
  "53. Як часто Ви уникаєте виходити з помешкання після настання темряви?",
  "53. How often do you avoid going out after dark?",
  resp_bhv,

  "bhv5",  "Scale 4: Risk Avoidance Behaviour",
  "54. Як часто Ви уникаєте користуватися транспортом міста після настання темряви?",
  "54. How often do you avoid using public transport after dark?",
  resp_bhv
)

# ── Render table ──────────────────────────────────────────────────────
instruments |>
  select(Code, Scale, Ukrainian_Formulation, English_Formulation, Response_Scale) |>
  kable(
    col.names = c("Code", "Scale", "Ukrainian formulation", "English formulation", "Response alternatives"),
    align     = c("l", "l", "l", "l", "l"),
    row.names = FALSE
  ) |>
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "bordered"),
    full_width        = TRUE,
    font_size         = 14
  ) |>
  row_spec(0, bold = TRUE, color = "white", background = "#1a3a5c") |>
  column_spec(1, bold = TRUE, width = "5em",  extra_css = "white-space: nowrap;") |>
  column_spec(2, width = "12em", extra_css = "font-style: italic; color: #2471a3;") |>
  column_spec(3, width = "22em") |>
  column_spec(4, width = "22em") |>
  column_spec(5, width = "14em", extra_css = "font-size: 0.8125rem; color: #555;") |>
  pack_rows("Scale 1: Perceived Safety Across Locations (safd2–safn5)",
            1, 8,  bold = TRUE, background = "#dbeafe", color = "#1a3a5c") |>
  pack_rows("Scale 2: Fear of Victimisation (fcv1–fcv7)",
            9, 13, bold = TRUE, background = "#d5f5e3", color = "#1a3a5c") |>
  pack_rows("Scale 2 (cont.): Subjective Risk of Victimisation (rcv1–rcv7)",
            14, 18, bold = TRUE, background = "#d5f5e3", color = "#1a3a5c") |>
  pack_rows("Scale 3: Neighbourhood Disorder (sp1–sp9)",
            19, 27, bold = TRUE, background = "#fef9e7", color = "#1a3a5c") |>
  pack_rows("Scale 4: Risk Avoidance Behaviour (bhv1–bhv5)",
            28, 32, bold = TRUE, background = "#fdebd0", color = "#1a3a5c")
Table 1: Measurement Instruments: Items and Response Alternatives
Code Scale Ukrainian formulation English formulation Response alternatives
Scale 1: Perceived Safety Across Locations (safd2–safn5)
safd2 Scale 1: Perceived Safety 13. Наскільки безпечно Ви почуваєтесь на самоті у світлий час доби йдучи в районі, де Ви мешкаєте? 13. How safe do you feel alone during daytime walking in the neighbourhood where you live? 1 — Зовсім безпечно / *Completely safe* 2 — Безпечно / *Safe* 3 — Небезпечно / *Unsafe* 4 — Зовсім небезпечно / *Completely unsafe*
safd3 Scale 1: Perceived Safety 14. Наскільки безпечно Ви почуваєтесь на самоті у світлий час доби у магазинах, аптеках? 14. How safe do you feel alone during daytime in shops and pharmacies? 1 — Зовсім безпечно / *Completely safe* 2 — Безпечно / *Safe* 3 — Небезпечно / *Unsafe* 4 — Зовсім небезпечно / *Completely unsafe*
safd4 Scale 1: Perceived Safety 15. Наскільки безпечно Ви почуваєтесь на самоті у світлий час доби у місцях відпочинку, дозвілля, розваг? 15. How safe do you feel alone during daytime in leisure and entertainment venues? 1 — Зовсім безпечно / *Completely safe* 2 — Безпечно / *Safe* 3 — Небезпечно / *Unsafe* 4 — Зовсім небезпечно / *Completely unsafe*
safd5 Scale 1: Perceived Safety 16. Наскільки безпечно Ви почуваєтесь на самоті у світлий час доби користуючись громадським транспортом міста? 16. How safe do you feel alone during daytime using public transport? 1 — Зовсім безпечно / *Completely safe* 2 — Безпечно / *Safe* 3 — Небезпечно / *Unsafe* 4 — Зовсім небезпечно / *Completely unsafe*
safn2 Scale 1: Perceived Safety 18. Наскільки безпечно Ви почуваєтесь на самоті у темний час доби після 22 години йдучи в районі, де Ви мешкаєте? 18. How safe do you feel alone at night (after 22:00) walking in the neighbourhood where you live? 1 — Зовсім безпечно / *Completely safe* 2 — Безпечно / *Safe* 3 — Небезпечно / *Unsafe* 4 — Зовсім небезпечно / *Completely unsafe*
safn3 Scale 1: Perceived Safety 19. Наскільки безпечно Ви почуваєтесь на самоті у темний час доби після 22 години у магазинах, аптеках? 19. How safe do you feel alone at night (after 22:00) in shops and pharmacies? 1 — Зовсім безпечно / *Completely safe* 2 — Безпечно / *Safe* 3 — Небезпечно / *Unsafe* 4 — Зовсім небезпечно / *Completely unsafe*
safn4 Scale 1: Perceived Safety 20. Наскільки безпечно Ви почуваєтесь на самоті у темний час доби після 22 години у місцях відпочинку, дозвілля, розваг? 20. How safe do you feel alone at night (after 22:00) in leisure and entertainment venues? 1 — Зовсім безпечно / *Completely safe* 2 — Безпечно / *Safe* 3 — Небезпечно / *Unsafe* 4 — Зовсім небезпечно / *Completely unsafe*
safn5 Scale 1: Perceived Safety 21. Наскільки безпечно Ви почуваєтесь на самоті у темний час доби після 22 години користуючись громадським транспортом міста? 21. How safe do you feel alone at night (after 22:00) using public transport? 1 — Зовсім безпечно / *Completely safe* 2 — Безпечно / *Safe* 3 — Небезпечно / *Unsafe* 4 — Зовсім небезпечно / *Completely unsafe*
Scale 2: Fear of Victimisation (fcv1–fcv7)
fcv1 Scale 2: Fear of Victimisation 23. Наскільки Ви боїтеся … хтось здійснить крадіжку з Вашого помешкання? 23. How afraid are you … that someone will burglarise your home? 1 — Зовсім не боюся / *Not afraid at all* 2 — Скоріше не боюся / *Rather not afraid* 3 — Скоріше боюся / *Rather afraid* 4 — Дуже боюся / *Very afraid*
fcv3 Scale 2: Fear of Victimisation 25. Наскільки Ви боїтеся … хтось нападе та застосує фізичну силу? 25. How afraid are you … that someone will attack and use physical force against you? 1 — Зовсім не боюся / *Not afraid at all* 2 — Скоріше не боюся / *Rather not afraid* 3 — Скоріше боюся / *Rather afraid* 4 — Дуже боюся / *Very afraid*
fcv4 Scale 2: Fear of Victimisation 26. Наскільки Ви боїтеся … хтось відбере погрозою або силою якусь річ (телефон)? 26. How afraid are you … that someone will rob you by threat or force (e.g. phone)? 1 — Зовсім не боюся / *Not afraid at all* 2 — Скоріше не боюся / *Rather not afraid* 3 — Скоріше боюся / *Rather afraid* 4 — Дуже боюся / *Very afraid*
fcv5 Scale 2: Fear of Victimisation 27. Наскільки Ви боїтеся … хтось поцупить особисті речі (у транспорті, на вулиці)? 27. How afraid are you … that someone will steal your personal belongings (in transport or on the street)? 1 — Зовсім не боюся / *Not afraid at all* 2 — Скоріше не боюся / *Rather not afraid* 3 — Скоріше боюся / *Rather afraid* 4 — Дуже боюся / *Very afraid*
fcv7 Scale 2: Fear of Victimisation 29. Наскільки Ви боїтеся … хтось заволодіє майном чи грошима шляхом обману? 29. How afraid are you … that someone will obtain your property or money through fraud? 1 — Зовсім не боюся / *Not afraid at all* 2 — Скоріше не боюся / *Rather not afraid* 3 — Скоріше боюся / *Rather afraid* 4 — Дуже боюся / *Very afraid*
Scale 2 (cont.): Subjective Risk of Victimisation (rcv1–rcv7)
rcv1 Scale 2: Subjective Risk of Victimisation 32. Як Ви оцінюєте потенційний ризик … хтось здійснить крадіжку з Вашого помешкання? 32. How do you assess the potential risk … that someone will burglarise your home? 1 — Зовсім неймовірно / *Very unlikely* 2 — Не дуже ймовірно / *Rather unlikely* 3 — Ймовірно / *Likely* 4 — Дуже ймовірно / *Very likely*
rcv3 Scale 2: Subjective Risk of Victimisation 34. Як Ви оцінюєте потенційний ризик … хтось нападе та застосує фізичну силу? 34. How do you assess the potential risk … that someone will attack and use physical force? 1 — Зовсім неймовірно / *Very unlikely* 2 — Не дуже ймовірно / *Rather unlikely* 3 — Ймовірно / *Likely* 4 — Дуже ймовірно / *Very likely*
rcv4 Scale 2: Subjective Risk of Victimisation 35. Як Ви оцінюєте потенційний ризик … хтось відбере погрозою або силою якусь річ (телефон)? 35. How do you assess the potential risk … that someone will rob you by threat or force? 1 — Зовсім неймовірно / *Very unlikely* 2 — Не дуже ймовірно / *Rather unlikely* 3 — Ймовірно / *Likely* 4 — Дуже ймовірно / *Very likely*
rcv5 Scale 2: Subjective Risk of Victimisation 36. Як Ви оцінюєте потенційний ризик … хтось поцупить особисті речі (у транспорті, на вулиці)? 36. How do you assess the potential risk … that someone will steal your personal belongings? 1 — Зовсім неймовірно / *Very unlikely* 2 — Не дуже ймовірно / *Rather unlikely* 3 — Ймовірно / *Likely* 4 — Дуже ймовірно / *Very likely*
rcv7 Scale 2: Subjective Risk of Victimisation 38. Як Ви оцінюєте потенційний ризик … хтось заволодіє майном чи грошима шляхом обману? 38. How do you assess the potential risk … that someone will obtain your property through fraud? 1 — Зовсім неймовірно / *Very unlikely* 2 — Не дуже ймовірно / *Rather unlikely* 3 — Ймовірно / *Likely* 4 — Дуже ймовірно / *Very likely*
Scale 3: Neighbourhood Disorder (sp1–sp9)
sp1 Scale 3: Neighbourhood Disorder 41. Наскільки проблемою у районі є … галасливі сусіди або галасливі вечірки? 41. To what extent is the following a problem in your neighbourhood … noisy neighbours or loud parties? 1 — Не проблема взагалі / *Not a problem at all* 2 — Незначна проблема / *A minor problem* 3 — Велика проблема / *A big problem* 4 — Дуже велика проблема / *A very big proble
sp2 Scale 3: Neighbourhood Disorder 42. Наскільки проблемою у районі є … вандалізм, пошкодження майна або автомобілів? 42. … vandalism, damage to property or vehicles? 1 — Не проблема взагалі / *Not a problem at all* 2 — Незначна проблема / *A minor problem* 3 — Велика проблема / *A big problem* 4 — Дуже велика проблема / *A very big proble
sp3 Scale 3: Neighbourhood Disorder 43. Наскільки проблемою у районі є … люди, які вживають або поширюють наркотики? 43. … people using or dealing drugs? 1 — Не проблема взагалі / *Not a problem at all* 2 — Незначна проблема / *A minor problem* 3 — Велика проблема / *A big problem* 4 — Дуже велика проблема / *A very big proble
sp4 Scale 3: Neighbourhood Disorder 44. Наскільки проблемою у районі є … хулігани та п'яниці у громадських місцях? 44. … hooligans and drunk people in public places? 1 — Не проблема взагалі / *Not a problem at all* 2 — Незначна проблема / *A minor problem* 3 — Велика проблема / *A big problem* 4 — Дуже велика проблема / *A very big proble
sp5 Scale 3: Neighbourhood Disorder 45. Наскільки проблемою у районі є … вигул собак без намордників та повідків? 45. … dogs walked without muzzles or leads? 1 — Не проблема взагалі / *Not a problem at all* 2 — Незначна проблема / *A minor problem* 3 — Велика проблема / *A big problem* 4 — Дуже велика проблема / *A very big proble
sp6 Scale 3: Neighbourhood Disorder 46. Наскільки проблемою у районі є … крадіжки з помешкань? 46. … residential burglaries? 1 — Не проблема взагалі / *Not a problem at all* 2 — Незначна проблема / *A minor problem* 3 — Велика проблема / *A big problem* 4 — Дуже велика проблема / *A very big proble
sp7 Scale 3: Neighbourhood Disorder 47. Наскільки проблемою у районі є … крадіжки особистих речей (у транспорті, на вулиці)? 47. … theft of personal belongings (in transport or on the street)? 1 — Не проблема взагалі / *Not a problem at all* 2 — Незначна проблема / *A minor problem* 3 — Велика проблема / *A big problem* 4 — Дуже велика проблема / *A very big proble
sp8 Scale 3: Neighbourhood Disorder 48. Наскільки проблемою у районі є … напади, побиття? 48. … physical attacks and assault? 1 — Не проблема взагалі / *Not a problem at all* 2 — Незначна проблема / *A minor problem* 3 — Велика проблема / *A big problem* 4 — Дуже велика проблема / *A very big proble
sp9 Scale 3: Neighbourhood Disorder 49. Наскільки проблемою у районі є … агресивні водії, порушення правил дорожнього руху? 49. … aggressive drivers and traffic violations? 1 — Не проблема взагалі / *Not a problem at all* 2 — Незначна проблема / *A minor problem* 3 — Велика проблема / *A big problem* 4 — Дуже велика проблема / *A very big proble
Scale 4: Risk Avoidance Behaviour (bhv1–bhv5)
bhv1 Scale 4: Risk Avoidance Behaviour 50. Як часто Ви ведете себе обачливо з незнайомими людьми? 50. How often do you behave cautiously around strangers? 1 — Майже ніколи / *Almost never* 2 — Іноді / *Sometimes* 3 — Часто / *Often* 4 — Майже завжди / *Almost always*
bhv2 Scale 4: Risk Avoidance Behaviour 51. Як часто Ви тримаєтесь подалі від певних місць та зустрічей? 51. How often do you avoid certain places and gatherings? 1 — Майже ніколи / *Almost never* 2 — Іноді / *Sometimes* 3 — Часто / *Often* 4 — Майже завжди / *Almost always*
bhv3 Scale 4: Risk Avoidance Behaviour 52. Як часто Ви уникаєте небезпечних побутових ситуацій? 52. How often do you avoid dangerous everyday situations? 1 — Майже ніколи / *Almost never* 2 — Іноді / *Sometimes* 3 — Часто / *Often* 4 — Майже завжди / *Almost always*
bhv4 Scale 4: Risk Avoidance Behaviour 53. Як часто Ви уникаєте виходити з помешкання після настання темряви? 53. How often do you avoid going out after dark? 1 — Майже ніколи / *Almost never* 2 — Іноді / *Sometimes* 3 — Часто / *Often* 4 — Майже завжди / *Almost always*
bhv5 Scale 4: Risk Avoidance Behaviour 54. Як часто Ви уникаєте користуватися транспортом міста після настання темряви? 54. How often do you avoid using public transport after dark? 1 — Майже ніколи / *Almost never* 2 — Іноді / *Sometimes* 3 — Часто / *Often* 4 — Майже завжди / *Almost always*

1 Setup & Data

1.1 Packages

▶ Show code
# ── Clean workspace ───────────────────────────────────────────────────
rm(list = ls())

# ── Packages ──────────────────────────────────────────────────────────
library(haven)       # SPSS data import
library(here)        # Portable file paths
library(janitor)     # clean_names()
library(dplyr)       # Data wrangling
library(tidyr)       # pivot_longer()
library(lavaan)      # CFA / SEM
library(semTools)    # reliability(), compRelSEM()
library(knitr)       # kable(), include_graphics()
library(kableExtra)  # Styled HTML tables
library(ggplot2)     # Plots
library(ggcorrplot)  # Correlation heatmaps
library(lavaanPlot)  # lavaanPlot(), save_png()
library(sjmisc)      # frq() frequency tables
library(EGAnet)      # Exploratory Graph Analysis
library(writexl)     # Excel export

1.2 Data Import

▶ Show code
# ── 1. Load SPSS dataset ──────────────────────────────────────────────
dataset <- read_sav(here("SAFE2016.sav"))

# ── 2. Standardise column names ───────────────────────────────────────
dataset <- dataset |> clean_names()

# ── 3. Define required variables ─────────────────────────────────────
required_vars <- c(
  "safd2","safd3","safd4","safd5",
  "safn2","safn3","safn4","safn5",
  "fcv1","fcv3","fcv4","fcv5","fcv7",
  "rcv1","rcv3","rcv4","rcv5","rcv7",
  "sp1","sp2","sp3","sp4","sp5","sp6","sp7","sp8","sp9",
  "bhv1","bhv2","bhv3","bhv4","bhv5",
  "sex"
)

# ── 4. Diagnostic check ───────────────────────────────────────────────
missing_vars <- setdiff(required_vars, names(dataset))
if (length(missing_vars) > 0) {
  cat("⚠  Variables NOT found:\n")
  cat(paste(" •", missing_vars, collapse = "\n"), "\n\n")
  cat("Available names:\n"); print(names(dataset))
  stop("Update 'required_vars' to match actual column names.")
} else {
  cat("✔  All required variables found.\n")
}
#> ✔  All required variables found.
▶ Show code
# ── 5. Select & listwise deletion ─────────────────────────────────────
df <- na.omit(dataset[required_vars])
all_vars <- names(df)[!names(df) %in% "sex"]   # substantive items only

cat(sprintf("Analytical sample (listwise deletion): N = %d, variables = %d\n",
            nrow(df), ncol(df)))
#> Analytical sample (listwise deletion): N = 467, variables = 33

1.3 Shared Helper Functions

▶ Show code
# ── 1. SPSS variable labels → styled table ────────────────────────────
print_labels <- function(data, vars) {
  tbl <- data.frame(
    Variable = vars,
    Label    = sapply(vars, function(v) {
      lbl <- attr(data[[v]], "label")
      if (is.null(lbl)) "(no label)" else as.character(lbl)
    }),
    stringsAsFactors = FALSE,
    row.names        = NULL
  )
  kable(tbl,
        col.names = c("Variable", "Question wording (SPSS label)"),
        align     = c("l", "l"),
        row.names = FALSE) |>
    kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                  full_width = TRUE, font_size = 14, position = "left") |>
    column_spec(1, bold = TRUE, width = "8em",
                extra_css = "white-space: nowrap;") |>
    column_spec(2, width = "auto")
}

# ── 2. Polychoric correlation — lower triangle ────────────────────────
polychoric_lower <- function(data, vars) {
  mat <- data |>
    select(all_of(vars)) |>
    lavCor(ordered = vars) |>
    round(2)
  mat[upper.tri(mat)] <- ""
  mat
}

# ── 3. Styled correlation table ───────────────────────────────────────
render_cor_table <- function(mat, cap) {
  kable(mat, caption = cap, align = "c") |>
    kable_styling(bootstrap_options = c("striped", "hover", "condensed", "bordered"),
                  full_width = FALSE, font_size = 14, position = "center") |>
    row_spec(0, bold = TRUE, color = "white", background = "#1a3a5c")
}

# ── 4. Model fit indices — ROBUST versions ────────────────────────────
#    WLSMV + se = "robust" → report robust fit statistics.
#    χ²(scaled) is retained as the test statistic (standard for WLSMV).
#    RMSEA, CFI, TLI → robust variants.
#    WRMR and SRMR have no robust variant.
fit_indices <- c(
  "chisq.scaled", "df.scaled", "pvalue.scaled",
  "rmsea.robust", "rmsea.ci.lower.robust", "rmsea.ci.upper.robust",
  "cfi.robust",   "tli.robust",
  "wrmr",         "srmr"
)
fit_labels <- c(
  "χ²(scaled)", "df", "p-value",
  "RMSEA(robust)", "RMSEA CI lower", "RMSEA CI upper",
  "CFI(robust)", "TLI(robust)",
  "WRMR", "SRMR"
)

render_fit_table <- function(fit_obj, model_label) {
  fm   <- fitMeasures(fit_obj, fit_indices)
  vals <- round(as.numeric(fm), 3)
  df_fm <- data.frame(Index = fit_labels, Value = vals)

  tbl <- kable(df_fm,
               caption   = paste("Model fit indices —", model_label),
               col.names = c("Fit Index", "Value"),
               align     = c("l", "r")) |>
    kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                  full_width = FALSE, font_size = 14, position = "left") |>
    row_spec(0, bold = TRUE, color = "white", background = "#1a3a5c")

  # Highlight rows meeting excellent-fit thresholds
  good_cfi   <- which(df_fm$Index %in% c("CFI(robust)", "TLI(robust)") & vals >= 0.95)
  good_rmsea <- which(df_fm$Index == "RMSEA(robust)" & vals < 0.06)
  good_wrmr  <- which(df_fm$Index == "WRMR" & vals < 1.0)
  for (r in c(good_cfi, good_rmsea, good_wrmr)) {
    tbl <- tbl |> row_spec(r, background = "#eafaf1")
  }
  tbl
}

# ── 5. Reliability table ──────────────────────────────────────────────
render_reliability_table <- function(fit_obj, model_label) {
  round(reliability(fit_obj), 3) |>
    as.data.frame() |>
    kable(caption = paste("Reliability coefficients —", model_label)) |>
    kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                  full_width = FALSE, font_size = 14) |>
    row_spec(0, bold = TRUE, color = "white", background = "#1a3a5c")
}

# ── 6. Bar chart factory ──────────────────────────────────────────────
create_barplot <- function(data, variables, title) {
  data |>
    select(all_of(variables)) |>
    pivot_longer(cols = everything(),
                 names_to  = "variable",
                 values_to = "value") |>
    mutate(value = as.factor(value)) |>
    ggplot(aes(x = value)) +
    geom_bar(fill = "#3498db", colour = "#1a6fa3", alpha = 0.85) +
    facet_wrap(~ variable, scales = "free_y", ncol = 3) +
    labs(title    = title,
         subtitle = paste0("n = ", nrow(data)),
         x = "Response value", y = "Frequency") +
    theme_minimal(base_size = 12) +
    theme(
      strip.text       = element_text(size = 10, face = "bold", colour = "#1a3a5c"),
      strip.background = element_rect(fill = "#eaf4fb", colour = NA),
      plot.title       = element_text(size = 13, face = "bold", colour = "#1a3a5c"),
      plot.subtitle    = element_text(size = 10, colour = "#7f8c8d"),
      axis.text.x      = element_text(angle = 45, hjust = 1, size = 9),
      axis.text.y      = element_text(size = 9),
      panel.grid.minor = element_blank()
    )
}

# ── 7. CFA path diagram → PNG → embed in HTML ─────────────────────────
#    lavaanPlot produces an htmlwidget (DiagrammeR/Graphviz).
#    In self-contained HTML, htmlwidgets may not render reliably.
#    Solution: save to PNG with save_png(), then embed via include_graphics().
#    This guarantees the diagram appears in all HTML output modes.
render_path_diagram <- function(fit_obj, file_name,
                                node_fs = 14, edge_fs = 12) {
  pl <- lavaanPlot(
    model        = fit_obj,
    coefs        = TRUE,
    stand        = TRUE,
    covs         = TRUE,
    stars        = list(regress = TRUE, latent = TRUE, covs = TRUE),
    node_options = list(fontsize = node_fs, shape = "box", fontname = "Arial"),
    edge_options = list(fontsize = edge_fs, fontname = "Arial")
  )
  # Save as high-resolution PNG
  save_png(pl, file_name, width = 800, height = 600)
  # Embed PNG in document (renders in all HTML modes incl. self-contained)
  knitr::include_graphics(file_name)
}

2 Descriptive Statistics

2.1 Frequency Distributions

▶ Show code
variable_groups <- list(
  list(vars  = c("safd2","safd3","safd4","safd5","safn2","safn3","safn4","safn5"),
       title = "Perceived safety across locations (Відчуття безпеки в локаціях)"),
  list(vars  = c("fcv1","fcv3","fcv4","fcv5","fcv7"),
       title = "Fear of victimisation (Страх віктимізації)"),
  list(vars  = c("rcv1","rcv3","rcv4","rcv5","rcv7"),
       title = "Subjective risk of victimisation (Суб'єктивний ризик віктимізації)"),
  list(vars  = c("sp1","sp2","sp3","sp4","sp5","sp6","sp7","sp8","sp9"),
       title = "Neighbourhood disorder (Проблеми району)"),
  list(vars  = c("bhv1","bhv2","bhv3","bhv4","bhv5"),
       title = "Risk avoidance behaviour (Стратегії уникнення ризику)")
)
▶ Show code
for (g in variable_groups) {
  cat("\n###", g$title, "\n\n")
  print(create_barplot(df, g$vars, g$title))
  cat("\n\n")
  print(print_labels(df, g$vars))
  cat("\n\n---\n\n")
}

2.1.1 Perceived safety across locations (Відчуття безпеки в локаціях)

Variable Question wording (SPSS label)
safd2
  1. Наскільки безпечно Ви почуваєтесь на самоті у світлий час доби йдучи в районі, де Ви мешкаєте
safd3
  1. Наскільки безпечно Ви почуваєтесь на самоті у світлий час доби у магазинах, аптеках
safd4
  1. Наскільки безпечно Ви почуваєтесь на самоті у світлий час доби у місцях відпочинку, дозвілля, розваг
safd5
  1. Наскільки безпечно Ви почуваєтесь на самоті у світлий час доби користуючись громадським транспортом міста
safn2
  1. Наскільки безпечно Ви почуваєтесь на самоті у темний час доби після 22 години йдучи в районі, де Ви мешкаєте
safn3
  1. Наскільки безпечно Ви почуваєтесь на самоті у темний час доби після 22 години у магазинах, аптеках
safn4
  1. Наскільки безпечно Ви почуваєтесь на самоті у темний час доби після 22 години у місцях відпочинку, дозвілля, розваг
safn5
  1. Наскільки безпечно Ви почуваєтесь на самоті у темний час доби після 22 години користуючись громадським транспортом міста

2.1.2 Fear of victimisation (Страх віктимізації)

Variable Question wording (SPSS label)
fcv1
  1. Наскільки Ви боїтеся … хтось здійснить крадіжку з Вашого помешкання
fcv3
  1. Наскільки Ви боїтеся … хтось нападе та застосує фізичну силу
fcv4
  1. Наскільки Ви боїтеся … хтось відбере погрозою або силою якусь річ (телефон)
fcv5
  1. Наскільки Ви боїтеся … хтось поцупить особисті речі (у транспорті, на вулиці)
fcv7
  1. Наскільки Ви боїтеся … хтось заволодіє майном чи грошима шляхом обману

2.1.3 Subjective risk of victimisation (Суб’єктивний ризик віктимізації)

Variable Question wording (SPSS label)
rcv1
  1. Як Ви оцінюєте потенційний ризик … хтось здійснить крадіжку з Вашого помешкання
rcv3
  1. Як Ви оцінюєте потенційний ризик … хтось нападе та застосує фізичну силу
rcv4
  1. Як Ви оцінюєте потенційний ризик … хтось відбере погрозою або силою якусь річ (телефон)
rcv5
  1. Як Ви оцінюєте потенційний ризик … хтось поцупить особисті речі (у транспорті, на вулиці)
rcv7
  1. Як Ви оцінюєте потенційний ризик … хтось заволодіє майном чи грошима шляхом обману

2.1.4 Neighbourhood disorder (Проблеми району)

Variable Question wording (SPSS label)
sp1
  1. Наскільки проблемою у районі є … галасливі сусіди або галасливі вечірки
sp2
  1. Наскільки проблемою у районі є … вандалізм, пошкодження майна або автомобілів
sp3
  1. Наскільки проблемою у районі є … люди, які вживають або поширюють наркотики
sp4
  1. Наскільки проблемою у районі є … хулігани та п’яниці у громадських місцях
sp5
  1. Наскільки проблемою у районі є … вигул собак без намордників та повідків
sp6
  1. Наскільки проблемою у районі є … крадіжки з помешкань
sp7
  1. Наскільки проблемою у районі є … крадіжки особистих речей (у транспорті, на вулиці)
sp8
  1. Наскільки проблемою у районі є … напади, побиття
sp9
  1. Наскільки проблемою у районі є … агресивні водії, порушення правил дорожнього руху

2.1.5 Risk avoidance behaviour (Стратегії уникнення ризику)

Variable Question wording (SPSS label)
bhv1
  1. Як часто Ви ведете себе обачливо з незнайомими людьми пр
bhv2
  1. Як часто Ви тримаєтесь подалi вiд певних мiсць та зустрi
bhv3
  1. Як часто Ви уникаєте небезпечних побутових ситуацiй
bhv4
  1. Як часто Ви уникаєте виходити з помешкання пiсля настанн
bhv5
  1. Як часто Ви уникаєте користуватися транспортом мiста пiс

2.2 Sex Distribution

▶ Show code
# 1 — male (чоловік), 2 — female (жінка)
sjmisc::frq(df$sex)
#> 1.Ваша стать: (x) <numeric> 
#> # total N=467 valid N=467 mean=1.51 sd=0.50
#> 
#> Value |           Label |   N | Raw % | Valid % | Cum. %
#> --------------------------------------------------------
#>   -99 | Немає відповіді |   0 |  0.00 |    0.00 |   0.00
#>     1 |             чол | 230 | 49.25 |   49.25 |  49.25
#>     2 |             жiн | 237 | 50.75 |   50.75 | 100.00
#>  <NA> |            <NA> |   0 |  0.00 |    <NA> |   <NA>

3 Polychoric Correlation Matrix

Polychoric correlations for all 32 substantive items computed via lavaan::lavCor() with ordered = TRUE. Variable sex excluded. Matrix exported to Excel.

▶ Show code
cor_plot_mat <- df |>
  select(all_of(all_vars)) |>
  lavCor(ordered = all_vars)

cor_export <- cor_plot_mat |> round(2) |> as.data.frame()
cor_export[upper.tri(cor_export)] <- ""

writexl::write_xlsx(
  cbind(Variable = rownames(cor_export), cor_export),
  "cor_matrix_all_variables.xlsx"
)

kable(cor_export,
      caption = "Polychoric correlation matrix — all substantive items (lower triangle)",
      align   = "c") |>
  kable_styling(bootstrap_options = c("striped","hover","condensed","bordered"),
                full_width = FALSE, font_size = 13, position = "center") |>
  row_spec(0, bold = TRUE, color = "white", background = "#1a3a5c")
Polychoric correlation matrix — all substantive items (lower triangle)
safd2 safd3 safd4 safd5 safn2 safn3 safn4 safn5 fcv1 fcv3 fcv4 fcv5 fcv7 rcv1 rcv3 rcv4 rcv5 rcv7 sp1 sp2 sp3 sp4 sp5 sp6 sp7 sp8 sp9 bhv1 bhv2 bhv3 bhv4 bhv5
safd2 1.00
safd3 0.65 1
safd4 0.57 0.8 1
safd5 0.58 0.66 0.65 1
safn2 0.63 0.42 0.39 0.44 1
safn3 0.48 0.7 0.57 0.53 0.6 1
safn4 0.38 0.54 0.66 0.53 0.49 0.69 1
safn5 0.45 0.51 0.5 0.76 0.56 0.66 0.65 1
fcv1 0.28 0.21 0.15 0.2 0.27 0.2 0.19 0.22 1
fcv3 0.28 0.24 0.22 0.27 0.32 0.21 0.24 0.32 0.55 1
fcv4 0.26 0.2 0.16 0.27 0.29 0.21 0.18 0.31 0.55 0.81 1
fcv5 0.25 0.26 0.2 0.35 0.32 0.29 0.22 0.43 0.5 0.62 0.71 1
fcv7 0.17 0.23 0.18 0.14 0.18 0.16 0.17 0.19 0.42 0.5 0.49 0.54 1
rcv1 0.29 0.26 0.22 0.23 0.3 0.26 0.12 0.17 0.56 0.26 0.31 0.3 0.24 1
rcv3 0.27 0.31 0.25 0.25 0.35 0.29 0.2 0.27 0.29 0.52 0.42 0.4 0.33 0.53 1
rcv4 0.30 0.28 0.24 0.32 0.4 0.23 0.2 0.32 0.35 0.45 0.54 0.47 0.37 0.52 0.76 1
rcv5 0.30 0.33 0.26 0.35 0.31 0.28 0.22 0.35 0.31 0.35 0.42 0.59 0.32 0.53 0.63 0.72 1
rcv7 0.35 0.34 0.35 0.29 0.2 0.27 0.23 0.21 0.2 0.23 0.24 0.31 0.47 0.44 0.5 0.5 0.53 1
sp1 0.09 0.12 0.2 0.16 0.22 0.13 0.16 0.11 0.09 0.04 0.06 0.15 0.08 0.12 0.03 0.04 0.12 0.16 1
sp2 0.23 0.19 0.15 0.22 0.3 0.19 0.16 0.18 0.23 0.12 0.14 0.17 0.2 0.21 0.11 0.16 0.12 0.2 0.37 1
sp3 0.09 0.08 0.11 0.13 0.11 0.1 0.1 0.05 0.1 0.05 0.08 0.11 0.13 0.13 0.09 0.03 0.02 0.1 0.2 0.53 1
sp4 0.23 0.14 0.18 0.22 0.38 0.21 0.22 0.23 0.2 0.2 0.2 0.25 0.17 0.22 0.24 0.2 0.15 0.16 0.34 0.57 0.61 1
sp5 0.16 0.16 0.15 0.18 0.28 0.14 0.16 0.18 0.12 0.12 0.13 0.18 0.18 0.11 0.1 0.13 0.14 0.17 0.2 0.35 0.22 0.44 1
sp6 0.16 0.21 0.21 0.25 0.26 0.24 0.19 0.18 0.39 0.14 0.19 0.24 0.21 0.4 0.25 0.23 0.23 0.2 0.26 0.47 0.43 0.46 0.36 1
sp7 0.24 0.23 0.21 0.29 0.29 0.2 0.21 0.26 0.28 0.19 0.31 0.43 0.25 0.33 0.26 0.34 0.36 0.27 0.26 0.46 0.38 0.51 0.32 0.66 1
sp8 0.28 0.19 0.19 0.21 0.3 0.2 0.21 0.15 0.28 0.23 0.22 0.3 0.24 0.25 0.29 0.24 0.18 0.23 0.23 0.47 0.47 0.53 0.29 0.6 0.67 1
sp9 0.19 0.23 0.2 0.21 0.21 0.23 0.2 0.16 0.15 0.14 0.1 0.19 0.11 0.2 0.17 0.16 0.17 0.23 0.15 0.38 0.42 0.45 0.35 0.42 0.55 0.57 1
bhv1 -0.01 -0.05 -0.03 -0.03 0 -0.03 0.01 0.05 -0.03 -0.02 -0.05 -0.06 -0.07 -0.05 -0.06 -0.05 -0.02 0.01 -0.04 -0.05 -0.06 -0.08 -0.07 -0.01 0.01 -0.05 0.07 1
bhv2 0.08 0.06 0.06 0.07 0.24 0.16 0.24 0.26 0.25 0.29 0.29 0.22 0.16 0.12 0.17 0.19 0.11 0.07 0.05 0.09 0.03 0.16 0.12 0.22 0.13 0.1 0.11 0.5 1
bhv3 0.08 0.05 -0.02 0.04 0.16 0.14 0.14 0.14 0.12 0.18 0.14 0.11 0.08 -0.03 0.03 0.1 0.03 0.03 0.02 0.05 0.01 0.05 0.06 0.15 0.08 0.08 0.07 0.45 0.59 1
bhv4 0.14 0.13 0.09 0.09 0.38 0.29 0.28 0.32 0.22 0.33 0.35 0.26 0.21 0.1 0.08 0.24 0.18 0.14 0.13 0.17 0.05 0.19 0.11 0.11 0.09 0.09 0.17 0.27 0.48 0.5 1
bhv5 0.13 0.22 0.13 0.18 0.35 0.34 0.3 0.42 0.21 0.28 0.26 0.31 0.22 0.07 0.07 0.19 0.14 0.13 0.07 0.11 0.04 0.18 0.17 0.17 0.1 0.09 0.18 0.25 0.48 0.45 0.8 1
▶ Show code
ggcorrplot(cor_plot_mat,
           type        = "lower",
           hc.order    = FALSE,
           lab         = FALSE,
           tl.cex      = 11,
           outline.col = "white",
           colors      = c("#c0392b", "#ffffff", "#2980b9"),
           ggtheme     = theme_minimal(base_size = 13)) +
  labs(title    = "Polychoric Correlation Matrix — All Constructs",
       subtitle = "Lower triangle  ·  red = negative  ·  blue = positive",
       fill     = "r") +
  theme(
    plot.title    = element_text(face = "bold", colour = "#1a3a5c", size = 15),
    plot.subtitle = element_text(colour = "#7f8c8d", size = 12),
    legend.title  = element_text(size = 11),
    axis.text     = element_text(size = 11)
  )


4 Exploratory Graph Analysis

4.1 EGA Solution

EGA (Golino & Epskamp, 2017) estimates the number of latent dimensions via regularised partial correlations (GLASSO). Applied to all 32 substantive items; sex excluded.

▶ Show code
ega_result <- EGA(data = df[, seq_along(all_vars)], corr = "auto", plot.EGA = TRUE)

▶ Show code
print(ega_result)
#> Model: GLASSO (EBIC with gamma = 0.5)
#> Correlations: auto
#> Lambda: 0.0849682042110116 (n = 100, ratio = 0.1)
#> 
#> Number of nodes: 32
#> Number of edges: 133
#> Edge density: 0.268
#> 
#> Non-zero edge weights: 
#>      M    SD    Min   Max
#>  0.106 0.119 -0.039 0.615
#> 
#> ----
#> 
#> Algorithm:  Walktrap
#> 
#> Number of communities:  4
#> 
#> safd2 safd3 safd4 safd5 safn2 safn3 safn4 safn5  fcv1  fcv3  fcv4  fcv5  fcv7 
#>     1     1     1     1     1     1     1     1     2     2     2     2     2 
#>  rcv1  rcv3  rcv4  rcv5  rcv7   sp1   sp2   sp3   sp4   sp5   sp6   sp7   sp8 
#>     2     2     2     2     2     3     3     3     3     3     3     3     3 
#>   sp9  bhv1  bhv2  bhv3  bhv4  bhv5 
#>     3     4     4     4     4     4 
#> 
#> ----
#> 
#> Unidimensional Method: Louvain
#> Unidimensional: No
#> 
#> ----
#> 
#> TEFI: -40.37
▶ Show code
png("plot_ega.png", width = 8, height = 6, units = "in", res = 300)
plot(ega_result)
dev.off()
#> png 
#>   2

4.2 Bootstrap EGA: Dimensional Stability

Bootstrap EGA (Golino et al., 2020) assesses the stability of the dimensional structure via resampling. Polychoric correlations are computed internally from raw data (corr = "auto") — not from a pre-computed matrix. iter = 500 bootstrap samples; seed = 123 for reproducibility.

Stability criterion: item-dimension assignment frequency ≥ 0.70 indicates a stable solution (Christensen & Golino, 2021).

▶ Show code
# ── Bootstrap EGA ─────────────────────────────────────────────────────
#    corr = "auto" → polychoric correlations computed from raw ordinal data
#    (NOT from a pre-computed matrix)
bootEGA(
  data  = df[, seq_along(all_vars)],   # 32 substantive items, sex excluded
  corr  = "auto",                       # auto-detects ordinal → polychoric
  iter  = 500,
  seed  = 123,
  type  = "resampling",                 # resampling (not parametric bootstrap)
  plot.typicalStructure = TRUE
)

#> Model: GLASSO (EBIC)
#> Correlations: auto
#> Algorithm:  Walktrap
#> Unidimensional Method:  Louvain
#> 
#> ----
#> 
#> EGA Type: EGA 
#> Bootstrap Samples: 500 (Resampling)
#>                        
#>                 4     5
#> Frequency:  0.934 0.066
#> 
#> Median dimensions: 4 [3.51, 4.49] 95% CI

5 Confirmatory Factor Analysis — Individual Scales

Estimator: WLSMV with robust standard errors (se = "robust"), appropriate for ordinal indicators (Flora & Curran, 2004).

Fit indices: χ²(scaled), df, p; RMSEA(robust) with 90% CI; CFI(robust); TLI(robust); WRMR; SRMR.

Benchmarks: RMSEA < .060 excellent, < .080 acceptable; CFI/TLI > .950 excellent, > .900 acceptable; WRMR < 1.0 (Brown, 2015). Cells meeting the excellent threshold are highlighted in green.

Full parameter estimates (factor loadings, thresholds, R²) are reported in Appendix A.


5.1 Model 1: Perceived Safety Across Locations

Constructs: Safety_d — daytime safety · Safety_n — night-time safety
Method effects: residual correlations between parallel day/night items for the same location.

Variables

Code Factor Indicator Формулювання запитання
safd2 Safety_d neighborhood — day Наскільки безпечно Ви почуваєтесь на самоті у світлий час доби йдучи в районі, де Ви мешкаєте?
safd3 Safety_d shops — day … у магазинах, аптеках?
safd4 Safety_d leisure — day … у місцях відпочинку, дозвілля, розваг?
safd5 Safety_d transport — day … користуючись громадським транспортом міста?
safn2 Safety_n neighborhood — night Наскільки безпечно Ви почуваєтесь на самоті у темний час доби (після 22:00) йдучи в районі, де Ви мешкаєте?
safn3 Safety_n shops — night … у магазинах, аптеках?
safn4 Safety_n leisure — night … у місцях відпочинку, дозвілля, розваг?
safn5 Safety_n transport — night … користуючись громадським транспортом міста?
▶ Show code
model.safety <- "
  Safety_d =~ safd2 + safd3 + safd4 + safd5
  Safety_n =~ safn2 + safn3 + safn4 + safn5
  safd2 ~~ safn2
  safd3 ~~ safn3
  safd4 ~~ safn4
  safd5 ~~ safn5
"

fit.safety <- cfa(model.safety,
                  data      = df,
                  ordered   = TRUE,
                  estimator = "WLSMV",
                  std.lv    = TRUE,
                  se        = "robust")

5.1.1 Polychoric Correlations

▶ Show code
polychoric_lower(df, c("safd2","safd3","safd4","safd5",
                       "safn2","safn3","safn4","safn5")) |>
  render_cor_table("Polychoric correlations — Perceived safety (day / night)")
Polychoric correlations — Perceived safety (day / night)
safd2 safd3 safd4 safd5 safn2 safn3 safn4 safn5
safd2 1
safd3 0.65 1
safd4 0.57 0.8 1
safd5 0.58 0.66 0.65 1
safn2 0.63 0.42 0.39 0.44 1
safn3 0.48 0.7 0.57 0.53 0.6 1
safn4 0.38 0.54 0.66 0.53 0.49 0.69 1
safn5 0.45 0.51 0.5 0.76 0.56 0.66 0.65 1

5.1.2 Model Fit

▶ Show code
render_fit_table(fit.safety, "Model 1 — Perceived Safety Across Locations")
Model fit indices — Model 1 — Perceived Safety Across Locations
Fit Index Value
χ²(scaled) 33.666
df 15.000
p-value 0.004
RMSEA(robust) 0.067
RMSEA CI lower 0.000
RMSEA CI upper 0.116
CFI(robust) 0.989
TLI(robust) 0.980
WRMR 0.562
SRMR 0.026

5.1.3 Path Diagram

▶ Show code
render_path_diagram(fit.safety, "pl_safety.png")

5.1.4 Reliability & Validity

▶ Show code
render_reliability_table(fit.safety, "Model 1 — Perceived Safety Across Locations")
Reliability coefficients — Model 1 — Perceived Safety Across Locations
Safety_d Safety_n
alpha 0.807 0.813
alpha.ord 0.882 0.862
omega 0.816 0.815
omega2 0.816 0.815
omega3 0.823 0.814
avevar 0.665 0.616
▶ Show code
cat("\nCategorical composite reliability (compRelSEM):\n")
#> 
#> Categorical composite reliability (compRelSEM):
▶ Show code
print(round(compRelSEM(fit.safety), 3))
#> Safety_d Safety_n 
#>    0.823    0.814

5.2 Model 2: Fear & Subjective Risk of Victimisation

Constructs: FCV — fear of crime · RCV — subjective risk of victimisation
Method effects: residual correlations between parallel fear/risk items for the same crime type.

Variables

Code Factor Indicator Формулювання запитання
fcv1 FCV burglary Наскільки часто Ви боїтесь стати жертвою крадіжки з помешкання?
fcv3 FCV assault … нападу?
fcv4 FCV robbery … пограбування?
fcv5 FCV theft … крадіжки?
fcv7 FCV fraud … шахрайства?
rcv1 RCV burglary — risk Яка ймовірність, що Ви станете жертвою крадіжки з помешкання?
rcv3 RCV assault — risk … нападу?
rcv4 RCV robbery — risk … пограбування?
rcv5 RCV theft — risk … крадіжки?
rcv7 RCV fraud — risk … шахрайства?
▶ Show code
model.fear <- "
  FCV =~ fcv1 + fcv5 + fcv7 + fcv3 + fcv4
  RCV =~ rcv1 + rcv5 + rcv7 + rcv3 + rcv4
  fcv1 ~~ rcv1
  fcv3 ~~ rcv3
  fcv4 ~~ rcv4
  fcv5 ~~ rcv5
  fcv7 ~~ rcv7
"

fit.fear <- cfa(model.fear,
                data      = df,
                ordered   = TRUE,
                estimator = "WLSMV",
                std.lv    = TRUE,
                se        = "robust")

5.2.1 Polychoric Correlations

▶ Show code
polychoric_lower(df, c("fcv1","fcv3","fcv4","fcv5","fcv7",
                       "rcv1","rcv3","rcv4","rcv5","rcv7")) |>
  render_cor_table("Polychoric correlations — Fear & subjective risk of victimisation")
Polychoric correlations — Fear & subjective risk of victimisation
fcv1 fcv3 fcv4 fcv5 fcv7 rcv1 rcv3 rcv4 rcv5 rcv7
fcv1 1
fcv3 0.55 1
fcv4 0.55 0.81 1
fcv5 0.5 0.62 0.71 1
fcv7 0.42 0.5 0.49 0.54 1
rcv1 0.56 0.26 0.31 0.3 0.24 1
rcv3 0.29 0.52 0.42 0.4 0.33 0.53 1
rcv4 0.35 0.45 0.54 0.47 0.37 0.52 0.76 1
rcv5 0.31 0.35 0.42 0.59 0.32 0.53 0.63 0.72 1
rcv7 0.2 0.23 0.24 0.31 0.47 0.44 0.5 0.5 0.53 1

5.2.2 Model Fit

▶ Show code
render_fit_table(fit.fear, "Model 2 — Fear & Subjective Risk of Victimisation")
Model fit indices — Model 2 — Fear & Subjective Risk of Victimisation
Fit Index Value
χ²(scaled) 68.181
df 29.000
p-value 0.000
RMSEA(robust) 0.078
RMSEA CI lower 0.053
RMSEA CI upper 0.104
CFI(robust) 0.973
TLI(robust) 0.958
WRMR 0.706
SRMR 0.032

5.2.3 Path Diagram

▶ Show code
render_path_diagram(fit.fear, "pl_fear.png")

5.2.4 Reliability & Validity

▶ Show code
render_reliability_table(fit.fear, "Model 2 — Fear & Subjective Risk of Victimisation")
Reliability coefficients — Model 2 — Fear & Subjective Risk of Victimisation
FCV RCV
alpha 0.835 0.823
alpha.ord 0.869 0.867
omega 0.846 0.824
omega2 0.846 0.824
omega3 0.854 0.820
avevar 0.597 0.579
▶ Show code
cat("\nCategorical composite reliability (compRelSEM):\n")
#> 
#> Categorical composite reliability (compRelSEM):
▶ Show code
print(round(compRelSEM(fit.fear), 3))
#>   FCV   RCV 
#> 0.854 0.820

5.3 Model 3: Neighbourhood Disorder

Constructs: SCP — serious crime problems · SAP — social annoyance problems

Variables

Code Factor Indicator Формулювання запитання
sp7 SCP pickpocketing Чи є у Вашому районі проблема з кишеньковими крадіжками?
sp8 SCP physical attacks … нападами?
sp6 SCP burglaries … крадіжками з помешкань?
sp9 SCP aggressive drivers … агресивними водіями?
sp2 SAP vandalism … вандалізмом?
sp1 SAP noise … галасливими сусідами?
sp4 SAP hooligans … хуліганами?
sp3 SAP drugs … наркотиками?
sp5 SAP stray dogs … безпритульними собаками?
▶ Show code
model.problems <- "
  SCP =~ sp7 + sp8 + sp6 + sp9
  SAP =~ sp2 + sp1 + sp4 + sp3 + sp5
"

fit.problems <- cfa(model.problems,
                    data      = df,
                    ordered   = TRUE,
                    estimator = "WLSMV",
                    std.lv    = TRUE,
                    se        = "robust")

5.3.1 Polychoric Correlations

▶ Show code
polychoric_lower(df, c("sp1","sp2","sp3","sp4","sp5",
                       "sp6","sp7","sp8","sp9")) |>
  render_cor_table("Polychoric correlations — Neighbourhood disorder")
Polychoric correlations — Neighbourhood disorder
sp1 sp2 sp3 sp4 sp5 sp6 sp7 sp8 sp9
sp1 1
sp2 0.37 1
sp3 0.2 0.53 1
sp4 0.34 0.57 0.61 1
sp5 0.2 0.35 0.22 0.44 1
sp6 0.26 0.47 0.43 0.46 0.36 1
sp7 0.26 0.46 0.38 0.51 0.32 0.66 1
sp8 0.23 0.47 0.47 0.53 0.29 0.6 0.67 1
sp9 0.15 0.38 0.42 0.45 0.35 0.42 0.55 0.57 1

5.3.2 Model Fit

▶ Show code
render_fit_table(fit.problems, "Model 3 — Neighbourhood Disorder")
Model fit indices — Model 3 — Neighbourhood Disorder
Fit Index Value
χ²(scaled) 70.646
df 26.000
p-value 0.000
RMSEA(robust) 0.080
RMSEA CI lower 0.061
RMSEA CI upper 0.099
CFI(robust) 0.955
TLI(robust) 0.938
WRMR 0.774
SRMR 0.039

5.3.3 Path Diagram

▶ Show code
render_path_diagram(fit.problems, "pl_problems.png")

5.3.4 Reliability & Validity

▶ Show code
render_reliability_table(fit.problems, "Model 3 — Neighbourhood Disorder")
Reliability coefficients — Model 3 — Neighbourhood Disorder
SCP SAP
alpha 0.806 0.705
alpha.ord 0.846 0.757
omega 0.814 0.726
omega2 0.814 0.726
omega3 0.821 0.737
avevar 0.591 0.421
▶ Show code
cat("\nCategorical composite reliability (compRelSEM):\n")
#> 
#> Categorical composite reliability (compRelSEM):
▶ Show code
print(round(compRelSEM(fit.problems), 3))
#>   SCP   SAP 
#> 0.821 0.737

5.4 Model 4: Risk Avoidance Behaviour

Constructs: GRA — general risk avoidance · NRA — nocturnal risk avoidance

Variables

Code Factor Indicator Формулювання запитання
bhv1 GRA caution — strangers Чи намагаєтесь Ви бути обачливим з незнайомцями?
bhv2 GRA avoid places Чи уникаєте Ви певних місць через страх стати жертвою злочину?
bhv3 GRA avoid risky situations Чи уникаєте Ви ризикованих ситуацій?
bhv4 NRA avoid going out at night Чи уникаєте Ви виходити на вулицю вночі?
bhv5 NRA avoid transport at night Чи уникаєте Ви транспорту вночі?
▶ Show code
model.behavior <- "
  GRA =~ bhv1 + bhv2 + bhv3
  NRA =~ bhv4 + bhv5
"

fit.behavior <- cfa(model.behavior,
                    data      = df,
                    ordered   = TRUE,
                    estimator = "WLSMV",
                    std.lv    = TRUE,
                    se        = "robust")

5.4.1 Polychoric Correlations

▶ Show code
polychoric_lower(df, c("bhv1","bhv2","bhv3","bhv4","bhv5")) |>
  render_cor_table("Polychoric correlations — Risk avoidance behaviour")
Polychoric correlations — Risk avoidance behaviour
bhv1 bhv2 bhv3 bhv4 bhv5
bhv1 1
bhv2 0.5 1
bhv3 0.45 0.59 1
bhv4 0.27 0.48 0.5 1
bhv5 0.25 0.48 0.45 0.8 1

5.4.2 Model Fit

▶ Show code
render_fit_table(fit.behavior, "Model 4 — Risk Avoidance Behaviour")
Model fit indices — Model 4 — Risk Avoidance Behaviour
Fit Index Value
χ²(scaled) 15.532
df 4.000
p-value 0.004
RMSEA(robust) 0.077
RMSEA CI lower 0.000
RMSEA CI upper 0.142
CFI(robust) 0.989
TLI(robust) 0.973
WRMR 0.534
SRMR 0.031

5.4.3 Path Diagram

▶ Show code
render_path_diagram(fit.behavior, "pl_behavior.png")

5.4.4 Reliability & Validity

▶ Show code
render_reliability_table(fit.behavior, "Model 4 — Risk Avoidance Behaviour")
Reliability coefficients — Model 4 — Risk Avoidance Behaviour
GRA NRA
alpha 0.698 0.834
alpha.ord 0.762 0.892
omega 0.708 0.839
omega2 0.708 0.839
omega3 0.698 0.839
avevar 0.517 0.806
▶ Show code
cat("\nCategorical composite reliability (compRelSEM):\n")
#> 
#> Categorical composite reliability (compRelSEM):
▶ Show code
print(round(compRelSEM(fit.behavior), 3))
#>   GRA   NRA 
#> 0.698 0.839

6 Integrated Measurement Model

All eight factors estimated simultaneously to assess inter-factor correlations and overall model fit. Method effects from individual models are retained.

▶ Show code
model.all <- "
  Safety_d =~ safd2 + safd3 + safd4 + safd5
  Safety_n =~ safn2 + safn3 + safn4 + safn5
              safd2 ~~ safn2
              safd3 ~~ safn3
              safd4 ~~ safn4
              safd5 ~~ safn5

  FCV =~ fcv1 + fcv5 + fcv7 + fcv3 + fcv4
  RCV =~ rcv1 + rcv5 + rcv7 + rcv3 + rcv4
         fcv1 ~~ rcv1
         fcv3 ~~ rcv3
         fcv4 ~~ rcv4
         fcv5 ~~ rcv5
         fcv7 ~~ rcv7

  SCP =~ sp7 + sp8 + sp6 + sp9
  SAP =~ sp2 + sp1 + sp4 + sp3 + sp5

  GRA =~ bhv1 + bhv2 + bhv3
  NRA =~ bhv4 + bhv5
"

fit.all <- cfa(model.all,
               data      = df,
               ordered   = TRUE,
               estimator = "WLSMV",
               std.lv    = TRUE,
               se        = "robust")

6.1 Model Fit

▶ Show code
render_fit_table(fit.all, "Model 5 — Integrated Measurement Model")
Model fit indices — Model 5 — Integrated Measurement Model
Fit Index Value
χ²(scaled) 829.848
df 427.000
p-value 0.000
RMSEA(robust) 0.064
RMSEA CI lower 0.057
RMSEA CI upper 0.071
CFI(robust) 0.917
TLI(robust) 0.903
WRMR 1.083
SRMR 0.053

6.2 Path Diagram

▶ Show code
render_path_diagram(fit.all, "pl_all.png", node_fs = 16, edge_fs = 13)

6.3 Discriminant Validity

HTMT₂ criterion (Henseler et al., 2015): values below 0.85 indicate adequate discriminant validity between factor pairs. Computed via semTools::htmt() with ordered = TRUE and htmt2 = TRUE.

▶ Show code
# ── HTMT₂ discriminant validity ───────────────────────────────────────
htmt_results <- htmt(
  model   = model.all,
  data    = df[, all_vars],
  ordered = TRUE,
  absolute = TRUE,
  htmt2   = TRUE
)

# ── Lower-triangle display ────────────────────────────────────────────
htmt_mat <- as.data.frame(round(htmt_results, 3))
htmt_mat[upper.tri(htmt_mat)] <- ""

# ── Export ────────────────────────────────────────────────────────────
writexl::write_xlsx(
  cbind(Factor = rownames(htmt_mat), htmt_mat),
  "htmt_results.xlsx"
)

# ── Table ─────────────────────────────────────────────────────────────
kable(htmt_mat,
      caption = "HTMT₂ discriminant validity matrix — Integrated Model
                 (values < 0.85 indicate adequate discriminant validity)",
      align   = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "bordered"),
                full_width = FALSE, font_size = 14, position = "center") |>
  row_spec(0, bold = TRUE, color = "white", background = "#1a3a5c")
HTMT₂ discriminant validity matrix — Integrated Model (values < 0.85 indicate adequate discriminant validity)
Safety_d Safety_n FCV RCV SCP SAP GRA NRA
Safety_d 1.000
Safety_n 0.830 1
FCV 0.364 0.409 1
RCV 0.479 0.431 0.634 1
SCP 0.355 0.365 0.377 0.429 1
SAP 0.319 0.354 0.287 0.253 0.814 1
GRA 0.070 0.142 0.202 0.099 0.116 0.116 1
NRA 0.185 0.476 0.386 0.183 0.176 0.205 0.61 1

7 Data Export

▶ Show code
write_sav(df, "Urban_Safety_Perception_v1.sav")
cat(sprintf("Saved: Urban_Safety_Perception_v1.sav  [%d rows × %d cols]\n",
            nrow(df), ncol(df)))
#> Saved: Urban_Safety_Perception_v1.sav  [467 rows × 33 cols]

8 Conclusion

This study examined the factor structure and measurement properties of four urban safety perception scales using data from a survey of university students in Kyiv (N = 467). The analysis proceeded in two stages: an exploratory stage using EGA to identify the latent dimensional structure, followed by confirmatory CFA to evaluate model fit, reliability, and validity for each scale and for an integrated eight-factor model.

Dimensional structure. EGA identified four distinct dimensions corresponding to the theoretically hypothesised constructs: perceived safety across locations, fear and subjective risk of victimisation, neighbourhood disorder, and risk avoidance behaviour. Bootstrap EGA confirmed the stability of this solution across 500 resampling iterations (replication rate = 93.4%; median dimensions = 4, 95% CI [3.51, 4.49]). Item-level stability coefficients ranged from 0.934 to 1.000, all exceeding the recommended threshold of 0.70, with minor instability observed only for the subjective risk items (rcv1–rcv7 = 0.934), reflecting the theoretical proximity of fear and perceived risk constructs.

Model fit. CFA confirmed the two-factor structures within each scale. Individual-scale models demonstrated acceptable to excellent fit: CFI(robust) ranged from .955 (Model 3) to .989 (Models 1 and 4), and RMSEA(robust) from .067 (Model 1) to .080 (Models 3 and 4). The integrated eight-factor model showed adequate overall fit (χ²(scaled) = 829.85, df = 427; CFI = .917, TLI = .903, RMSEA = .064, SRMR = .053), though WRMR slightly exceeded the recommended threshold of 1.0 (WRMR = 1.083), suggesting some residual misfit in the joint model.

Reliability. Composite reliability (ω) was good to excellent for most subscales: FCV (ω = .854), NRA (ω = .839), Safety_d (ω = .823), Safety_n (ω = .814), RCV (ω = .820), SCP (ω = .821), and SAP (ω = .737). The lowest reliability was observed for GRA — General Risk Avoidance (ω = .698), which is attributable to the small number of indicators (three items) and the broader behavioural content of this subscale.
Average variance extracted (AVE) exceeded .50 for seven of eight subscales, supporting convergent validity; the only exception was SAP (AVE = .421).

Discriminant validity. All HTMT₂ values fell below the recommended threshold of .85, supporting discriminant validity across all eight factor pairs. The highest HTMT₂ value was observed between Safety_d and Safety_n (.830), consistent with the shared method variance introduced by the parallel day/night item format — a finding addressed in the model through residual correlations between paired items.

Limitations. Several limitations should be noted. First, the sample is restricted to university students from five Kyiv institutions, limiting generalisability to broader urban populations. Second, the data were collected in 2016, prior to significant societal changes in Ukraine, which may affect the contemporary relevance of the findings. Third, measurement invariance across demographic subgroups (e.g., sex, year of study) was not examined and should be addressed in future research.

Implications. Overall, the four urban safety perception scales demonstrated adequate to good measurement properties in the present sample. The instruments may be used with confidence in further research on fear of crime and safety perception among Ukrainian university students. Future studies should examine the replicability of the factor structure in general population samples and test for measurement invariance across groups and time points.

References

Bova, A. (2020). Fear of crime of Kyiv students: Experience of construction and use of sociological indices. Science and Law Enforcement, 4(50), 171–183. [In Ukrainian]. http://naukaipravoohorona.com/journal/ukr/2020_4.pdf

Supplementary Materials

Survey questionnaire & data: osf.io/4mxje

Appendix A: Full CFA Parameter Estimates

This appendix contains the full lavaan output for each model: standardised factor loadings, standard errors, z-values, p-values, thresholds, residual variances, factor correlations, and R² values.

A.1 Model 1 — Perceived Safety Across Locations

▶ Show code
summary(fit.safety, fit.measures = TRUE, standardized = TRUE, rsquare = TRUE)
#> lavaan 0.6-21 ended normally after 22 iterations
#> 
#>   Estimator                                       DWLS
#>   Optimization method                           NLMINB
#>   Number of model parameters                        37
#> 
#>   Number of observations                           467
#> 
#> Model Test User Model:
#>                                               Standard      Scaled
#>   Test Statistic                                16.421      33.666
#>   Degrees of freedom                                15          15
#>   P-value (Unknown)                                 NA       0.004
#>   Scaling correction factor                                  0.527
#>   Shift parameter                                            2.523
#>     simple second-order correction                                
#> 
#> Model Test Baseline Model:
#> 
#>   Test statistic                              9489.318    4874.361
#>   Degrees of freedom                                28          28
#>   P-value                                           NA       0.000
#>   Scaling correction factor                                  1.952
#> 
#> User Model versus Baseline Model:
#> 
#>   Comparative Fit Index (CFI)                    1.000       0.996
#>   Tucker-Lewis Index (TLI)                       1.000       0.993
#>                                                                   
#>   Robust Comparative Fit Index (CFI)                         0.989
#>   Robust Tucker-Lewis Index (TLI)                            0.980
#> 
#> Root Mean Square Error of Approximation:
#> 
#>   RMSEA                                          0.014       0.052
#>   90 Percent confidence interval - lower         0.000       0.028
#>   90 Percent confidence interval - upper         0.047       0.075
#>   P-value H_0: RMSEA <= 0.050                    0.967       0.418
#>   P-value H_0: RMSEA >= 0.080                    0.000       0.022
#>                                                                   
#>   Robust RMSEA                                               0.067
#>   90 Percent confidence interval - lower                     0.000
#>   90 Percent confidence interval - upper                     0.116
#>   P-value H_0: Robust RMSEA <= 0.050                         0.266
#>   P-value H_0: Robust RMSEA >= 0.080                         0.367
#> 
#> Standardized Root Mean Square Residual:
#> 
#>   SRMR                                           0.026       0.026
#> 
#> Parameter Estimates:
#> 
#>   Parameterization                               Delta
#>   Standard errors                           Robust.sem
#>   Information                                 Expected
#>   Information saturated (h1) model        Unstructured
#> 
#> Latent Variables:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>   Safety_d =~                                                           
#>     safd2             0.712    0.027   26.019    0.000    0.712    0.712
#>     safd3             0.897    0.023   38.667    0.000    0.897    0.897
#>     safd4             0.853    0.025   33.614    0.000    0.853    0.853
#>     safd5             0.790    0.026   30.188    0.000    0.790    0.790
#>   Safety_n =~                                                           
#>     safn2             0.666    0.032   20.849    0.000    0.666    0.666
#>     safn3             0.867    0.024   36.310    0.000    0.867    0.867
#>     safn4             0.800    0.022   35.990    0.000    0.800    0.800
#>     safn5             0.793    0.021   37.228    0.000    0.793    0.793
#> 
#> Covariances:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>  .safd2 ~~                                                              
#>    .safn2             0.267    0.029    9.363    0.000    0.267    0.510
#>  .safd3 ~~                                                              
#>    .safn3             0.110    0.023    4.694    0.000    0.110    0.499
#>  .safd4 ~~                                                              
#>    .safn4             0.139    0.029    4.781    0.000    0.139    0.445
#>  .safd5 ~~                                                              
#>    .safn5             0.287    0.030    9.732    0.000    0.287    0.770
#>   Safety_d ~~                                                           
#>     Safety_n          0.759    0.030   25.033    0.000    0.759    0.759
#> 
#> Thresholds:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>     safd2|t1         -0.219    0.059   -3.741    0.000   -0.219   -0.219
#>     safd2|t2          1.315    0.081   16.327    0.000    1.315    1.315
#>     safd2|t3          2.384    0.183   12.997    0.000    2.384    2.384
#>     safd3|t1          0.192    0.058    3.280    0.001    0.192    0.192
#>     safd3|t2          1.881    0.116   16.193    0.000    1.881    1.881
#>     safd3|t3          2.488    0.205   12.143    0.000    2.488    2.488
#>     safd4|t1         -0.225    0.059   -3.834    0.000   -0.225   -0.225
#>     safd4|t2          1.368    0.083   16.515    0.000    1.368    1.368
#>     safd4|t3          2.301    0.169   13.650    0.000    2.301    2.301
#>     safd5|t1         -0.829    0.066  -12.580    0.000   -0.829   -0.829
#>     safd5|t2          0.476    0.061    7.871    0.000    0.476    0.476
#>     safd5|t3          1.768    0.107   16.575    0.000    1.768    1.768
#>     safn2|t1         -1.123    0.074  -15.275    0.000   -1.123   -1.123
#>     safn2|t2          0.137    0.058    2.357    0.018    0.137    0.137
#>     safn2|t3          1.410    0.085   16.634    0.000    1.410    1.410
#>     safn3|t1         -0.441    0.060   -7.324    0.000   -0.441   -0.441
#>     safn3|t2          0.975    0.069   14.067    0.000    0.975    0.975
#>     safn3|t3          2.069    0.136   15.242    0.000    2.069    2.069
#>     safn4|t1         -1.001    0.070  -14.304    0.000   -1.001   -1.001
#>     safn4|t2          0.280    0.059    4.755    0.000    0.280    0.280
#>     safn4|t3          1.592    0.095   16.836    0.000    1.592    1.592
#>     safn5|t1         -1.175    0.075  -15.617    0.000   -1.175   -1.175
#>     safn5|t2         -0.003    0.058   -0.046    0.963   -0.003   -0.003
#>     safn5|t3          1.154    0.075   15.482    0.000    1.154    1.154
#> 
#> Variances:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>    .safd2             0.494                               0.494    0.494
#>    .safd3             0.196                               0.196    0.196
#>    .safd4             0.273                               0.273    0.273
#>    .safd5             0.376                               0.376    0.376
#>    .safn2             0.556                               0.556    0.556
#>    .safn3             0.249                               0.249    0.249
#>    .safn4             0.360                               0.360    0.360
#>    .safn5             0.371                               0.371    0.371
#>     Safety_d          1.000                               1.000    1.000
#>     Safety_n          1.000                               1.000    1.000
#> 
#> R-Square:
#>                    Estimate
#>     safd2             0.506
#>     safd3             0.804
#>     safd4             0.727
#>     safd5             0.624
#>     safn2             0.444
#>     safn3             0.751
#>     safn4             0.640
#>     safn5             0.629

A.2 Model 2 — Fear & Subjective Risk of Victimisation

▶ Show code
summary(fit.fear, fit.measures = TRUE, standardized = TRUE, rsquare = TRUE)
#> lavaan 0.6-21 ended normally after 28 iterations
#> 
#>   Estimator                                       DWLS
#>   Optimization method                           NLMINB
#>   Number of model parameters                        46
#> 
#>   Number of observations                           467
#> 
#> Model Test User Model:
#>                                               Standard      Scaled
#>   Test Statistic                                37.407      68.181
#>   Degrees of freedom                                29          29
#>   P-value (Unknown)                                 NA       0.000
#>   Scaling correction factor                                  0.599
#>   Shift parameter                                            5.687
#>     simple second-order correction                                
#> 
#> Model Test Baseline Model:
#> 
#>   Test statistic                             11655.143    5469.234
#>   Degrees of freedom                                45          45
#>   P-value                                           NA       0.000
#>   Scaling correction factor                                  2.140
#> 
#> User Model versus Baseline Model:
#> 
#>   Comparative Fit Index (CFI)                    0.999       0.993
#>   Tucker-Lewis Index (TLI)                       0.999       0.989
#>                                                                   
#>   Robust Comparative Fit Index (CFI)                         0.973
#>   Robust Tucker-Lewis Index (TLI)                            0.958
#> 
#> Root Mean Square Error of Approximation:
#> 
#>   RMSEA                                          0.025       0.054
#>   90 Percent confidence interval - lower         0.000       0.037
#>   90 Percent confidence interval - upper         0.046       0.071
#>   P-value H_0: RMSEA <= 0.050                    0.979       0.329
#>   P-value H_0: RMSEA >= 0.080                    0.000       0.004
#>                                                                   
#>   Robust RMSEA                                               0.078
#>   90 Percent confidence interval - lower                     0.053
#>   90 Percent confidence interval - upper                     0.104
#>   P-value H_0: Robust RMSEA <= 0.050                         0.036
#>   P-value H_0: Robust RMSEA >= 0.080                         0.476
#> 
#> Standardized Root Mean Square Residual:
#> 
#>   SRMR                                           0.032       0.032
#> 
#> Parameter Estimates:
#> 
#>   Parameterization                               Delta
#>   Standard errors                           Robust.sem
#>   Information                                 Expected
#>   Information saturated (h1) model        Unstructured
#> 
#> Latent Variables:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>   FCV =~                                                                
#>     fcv1              0.633    0.032   19.853    0.000    0.633    0.633
#>     fcv5              0.792    0.023   33.954    0.000    0.792    0.792
#>     fcv7              0.617    0.034   18.339    0.000    0.617    0.617
#>     fcv3              0.859    0.018   47.176    0.000    0.859    0.859
#>     fcv4              0.915    0.016   58.246    0.000    0.915    0.915
#>   RCV =~                                                                
#>     rcv1              0.631    0.034   18.705    0.000    0.631    0.631
#>     rcv5              0.800    0.021   37.981    0.000    0.800    0.800
#>     rcv7              0.597    0.033   17.985    0.000    0.597    0.597
#>     rcv3              0.827    0.020   40.475    0.000    0.827    0.827
#>     rcv4              0.903    0.015   60.094    0.000    0.903    0.903
#> 
#> Covariances:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>  .fcv1 ~~                                                               
#>    .rcv1              0.326    0.032   10.277    0.000    0.326    0.543
#>  .fcv3 ~~                                                               
#>    .rcv3              0.111    0.028    3.995    0.000    0.111    0.385
#>  .fcv4 ~~                                                               
#>    .rcv4              0.059    0.025    2.402    0.016    0.059    0.342
#>  .fcv5 ~~                                                               
#>    .rcv5              0.228    0.026    8.678    0.000    0.228    0.621
#>  .fcv7 ~~                                                               
#>    .rcv7              0.252    0.036    7.098    0.000    0.252    0.399
#>   FCV ~~                                                                
#>     RCV               0.580    0.038   15.150    0.000    0.580    0.580
#> 
#> Thresholds:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>     fcv1|t1          -1.074    0.072  -14.914    0.000   -1.074   -1.074
#>     fcv1|t2           0.159    0.058    2.726    0.006    0.159    0.159
#>     fcv1|t3           1.123    0.074   15.275    0.000    1.123    1.123
#>     fcv5|t1          -1.328    0.081  -16.377    0.000   -1.328   -1.328
#>     fcv5|t2          -0.297    0.059   -5.031    0.000   -0.297   -0.297
#>     fcv5|t3           0.892    0.067   13.253    0.000    0.892    0.892
#>     fcv7|t1          -0.792    0.065  -12.152    0.000   -0.792   -0.792
#>     fcv7|t2           0.186    0.058    3.188    0.001    0.186    0.186
#>     fcv7|t3           1.242    0.078   15.995    0.000    1.242    1.242
#>     fcv3|t1          -1.037    0.071  -14.613    0.000   -1.037   -1.037
#>     fcv3|t2           0.030    0.058    0.508    0.611    0.030    0.030
#>     fcv3|t3           1.065    0.072   14.839    0.000    1.065    1.065
#>     fcv4|t1          -1.037    0.071  -14.613    0.000   -1.037   -1.037
#>     fcv4|t2          -0.013    0.058   -0.231    0.817   -0.013   -0.013
#>     fcv4|t3           1.113    0.073   15.204    0.000    1.113    1.113
#>     rcv1|t1          -0.756    0.065  -11.719    0.000   -0.756   -0.756
#>     rcv1|t2           0.792    0.065   12.152    0.000    0.792    0.792
#>     rcv1|t3           1.985    0.126   15.710    0.000    1.985    1.985
#>     rcv5|t1          -1.175    0.075  -15.617    0.000   -1.175   -1.175
#>     rcv5|t2           0.078    0.058    1.340    0.180    0.078    0.078
#>     rcv5|t3           1.396    0.084   16.597    0.000    1.396    1.396
#>     rcv7|t1          -0.600    0.062   -9.681    0.000   -0.600   -0.600
#>     rcv7|t2           0.814    0.066   12.409    0.000    0.814    0.814
#>     rcv7|t3           1.851    0.113   16.312    0.000    1.851    1.851
#>     rcv3|t1          -1.019    0.070  -14.460    0.000   -1.019   -1.019
#>     rcv3|t2           0.633    0.062   10.129    0.000    0.633    0.633
#>     rcv3|t3           1.914    0.119   16.055    0.000    1.914    1.914
#>     rcv4|t1          -0.916    0.068  -13.501    0.000   -0.916   -0.916
#>     rcv4|t2           0.458    0.060    7.598    0.000    0.458    0.458
#>     rcv4|t3           1.822    0.111   16.414    0.000    1.822    1.822
#> 
#> Variances:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>    .fcv1              0.600                               0.600    0.600
#>    .fcv5              0.373                               0.373    0.373
#>    .fcv7              0.619                               0.619    0.619
#>    .fcv3              0.262                               0.262    0.262
#>    .fcv4              0.163                               0.163    0.163
#>    .rcv1              0.602                               0.602    0.602
#>    .rcv5              0.361                               0.361    0.361
#>    .rcv7              0.644                               0.644    0.644
#>    .rcv3              0.316                               0.316    0.316
#>    .rcv4              0.185                               0.185    0.185
#>     FCV               1.000                               1.000    1.000
#>     RCV               1.000                               1.000    1.000
#> 
#> R-Square:
#>                    Estimate
#>     fcv1              0.400
#>     fcv5              0.627
#>     fcv7              0.381
#>     fcv3              0.738
#>     fcv4              0.837
#>     rcv1              0.398
#>     rcv5              0.639
#>     rcv7              0.356
#>     rcv3              0.684
#>     rcv4              0.815

A.3 Model 3 — Neighbourhood Disorder

▶ Show code
summary(fit.problems, fit.measures = TRUE, standardized = TRUE, rsquare = TRUE)
#> lavaan 0.6-21 ended normally after 18 iterations
#> 
#>   Estimator                                       DWLS
#>   Optimization method                           NLMINB
#>   Number of model parameters                        37
#> 
#>   Number of observations                           467
#> 
#> Model Test User Model:
#>                                               Standard      Scaled
#>   Test Statistic                                37.709      70.646
#>   Degrees of freedom                                26          26
#>   P-value (Unknown)                                 NA       0.000
#>   Scaling correction factor                                  0.556
#>   Shift parameter                                            2.863
#>     simple second-order correction                                
#> 
#> Model Test Baseline Model:
#> 
#>   Test statistic                              5144.208    2789.162
#>   Degrees of freedom                                36          36
#>   P-value                                           NA       0.000
#>   Scaling correction factor                                  1.855
#> 
#> User Model versus Baseline Model:
#> 
#>   Comparative Fit Index (CFI)                    0.998       0.984
#>   Tucker-Lewis Index (TLI)                       0.997       0.978
#>                                                                   
#>   Robust Comparative Fit Index (CFI)                         0.955
#>   Robust Tucker-Lewis Index (TLI)                            0.938
#> 
#> Root Mean Square Error of Approximation:
#> 
#>   RMSEA                                          0.031       0.061
#>   90 Percent confidence interval - lower         0.000       0.044
#>   90 Percent confidence interval - upper         0.052       0.078
#>   P-value H_0: RMSEA <= 0.050                    0.934       0.139
#>   P-value H_0: RMSEA >= 0.080                    0.000       0.032
#>                                                                   
#>   Robust RMSEA                                               0.080
#>   90 Percent confidence interval - lower                     0.061
#>   90 Percent confidence interval - upper                     0.099
#>   P-value H_0: Robust RMSEA <= 0.050                         0.006
#>   P-value H_0: Robust RMSEA >= 0.080                         0.519
#> 
#> Standardized Root Mean Square Residual:
#> 
#>   SRMR                                           0.039       0.039
#> 
#> Parameter Estimates:
#> 
#>   Parameterization                               Delta
#>   Standard errors                           Robust.sem
#>   Information                                 Expected
#>   Information saturated (h1) model        Unstructured
#> 
#> Latent Variables:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>   SCP =~                                                                
#>     sp7               0.819    0.020   40.038    0.000    0.819    0.819
#>     sp8               0.812    0.023   34.839    0.000    0.812    0.812
#>     sp6               0.764    0.024   31.389    0.000    0.764    0.764
#>     sp9               0.673    0.030   22.161    0.000    0.673    0.673
#>   SAP =~                                                                
#>     sp2               0.734    0.031   23.304    0.000    0.734    0.734
#>     sp1               0.398    0.047    8.426    0.000    0.398    0.398
#>     sp4               0.820    0.026   30.971    0.000    0.820    0.820
#>     sp3               0.699    0.031   22.243    0.000    0.699    0.699
#>     sp5               0.500    0.041   12.126    0.000    0.500    0.500
#> 
#> Covariances:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>   SCP ~~                                                                
#>     SAP               0.791    0.030   26.242    0.000    0.791    0.791
#> 
#> Thresholds:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>     sp7|t1           -0.957    0.069  -13.907    0.000   -0.957   -0.957
#>     sp7|t2            0.094    0.058    1.618    0.106    0.094    0.094
#>     sp7|t3            1.144    0.074   15.414    0.000    1.144    1.144
#>     sp8|t1           -0.714    0.064  -11.193    0.000   -0.714   -0.714
#>     sp8|t2            0.359    0.059    6.042    0.000    0.359    0.359
#>     sp8|t3            1.315    0.081   16.327    0.000    1.315    1.315
#>     sp6|t1           -0.884    0.067  -13.170    0.000   -0.884   -0.884
#>     sp6|t2            0.208    0.059    3.557    0.000    0.208    0.208
#>     sp6|t3            1.175    0.075   15.617    0.000    1.175    1.175
#>     sp9|t1           -0.916    0.068  -13.501    0.000   -0.916   -0.916
#>     sp9|t2            0.143    0.058    2.449    0.014    0.143    0.143
#>     sp9|t3            1.094    0.073   15.060    0.000    1.094    1.094
#>     sp2|t1           -0.423    0.060   -7.050    0.000   -0.423   -0.423
#>     sp2|t2            0.666    0.063   10.574    0.000    0.666    0.666
#>     sp2|t3            1.652    0.098   16.795    0.000    1.652    1.652
#>     sp1|t1           -0.319    0.059   -5.399    0.000   -0.319   -0.319
#>     sp1|t2            0.845    0.066   12.750    0.000    0.845    0.845
#>     sp1|t3            1.368    0.083   16.515    0.000    1.368    1.368
#>     sp4|t1           -1.123    0.074  -15.275    0.000   -1.123   -1.123
#>     sp4|t2           -0.046    0.058   -0.786    0.432   -0.046   -0.046
#>     sp4|t3            1.175    0.075   15.617    0.000    1.175    1.175
#>     sp3|t1           -0.494    0.061   -8.144    0.000   -0.494   -0.494
#>     sp3|t2            0.336    0.059    5.675    0.000    0.336    0.336
#>     sp3|t3            1.186    0.076   15.682    0.000    1.186    1.186
#>     sp5|t1           -0.556    0.061   -9.050    0.000   -0.556   -0.556
#>     sp5|t2            0.494    0.061    8.144    0.000    0.494    0.494
#>     sp5|t3            1.266    0.079   16.111    0.000    1.266    1.266
#> 
#> Variances:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>    .sp7               0.330                               0.330    0.330
#>    .sp8               0.341                               0.341    0.341
#>    .sp6               0.416                               0.416    0.416
#>    .sp9               0.547                               0.547    0.547
#>    .sp2               0.462                               0.462    0.462
#>    .sp1               0.842                               0.842    0.842
#>    .sp4               0.328                               0.328    0.328
#>    .sp3               0.511                               0.511    0.511
#>    .sp5               0.750                               0.750    0.750
#>     SCP               1.000                               1.000    1.000
#>     SAP               1.000                               1.000    1.000
#> 
#> R-Square:
#>                    Estimate
#>     sp7               0.670
#>     sp8               0.659
#>     sp6               0.584
#>     sp9               0.453
#>     sp2               0.538
#>     sp1               0.158
#>     sp4               0.672
#>     sp3               0.489
#>     sp5               0.250

A.4 Model 4 — Risk Avoidance Behaviour

▶ Show code
summary(fit.behavior, fit.measures = TRUE, standardized = TRUE, rsquare = TRUE)
#> lavaan 0.6-21 ended normally after 12 iterations
#> 
#>   Estimator                                       DWLS
#>   Optimization method                           NLMINB
#>   Number of model parameters                        21
#> 
#>   Number of observations                           467
#> 
#> Model Test User Model:
#>                                               Standard      Scaled
#>   Test Statistic                                 7.141      15.532
#>   Degrees of freedom                                 4           4
#>   P-value (Unknown)                                 NA       0.004
#>   Scaling correction factor                                  0.469
#>   Shift parameter                                            0.290
#>     simple second-order correction                                
#> 
#> Model Test Baseline Model:
#> 
#>   Test statistic                              2853.575    2006.409
#>   Degrees of freedom                                10          10
#>   P-value                                           NA       0.000
#>   Scaling correction factor                                  1.424
#> 
#> User Model versus Baseline Model:
#> 
#>   Comparative Fit Index (CFI)                    0.999       0.994
#>   Tucker-Lewis Index (TLI)                       0.997       0.986
#>                                                                   
#>   Robust Comparative Fit Index (CFI)                         0.989
#>   Robust Tucker-Lewis Index (TLI)                            0.973
#> 
#> Root Mean Square Error of Approximation:
#> 
#>   RMSEA                                          0.041       0.079
#>   90 Percent confidence interval - lower         0.000       0.040
#>   90 Percent confidence interval - upper         0.089       0.122
#>   P-value H_0: RMSEA <= 0.050                    0.550       0.102
#>   P-value H_0: RMSEA >= 0.080                    0.100       0.530
#>                                                                   
#>   Robust RMSEA                                               0.077
#>   90 Percent confidence interval - lower                     0.000
#>   90 Percent confidence interval - upper                     0.142
#>   P-value H_0: Robust RMSEA <= 0.050                         0.196
#>   P-value H_0: Robust RMSEA >= 0.080                         0.535
#> 
#> Standardized Root Mean Square Residual:
#> 
#>   SRMR                                           0.031       0.031
#> 
#> Parameter Estimates:
#> 
#>   Parameterization                               Delta
#>   Standard errors                           Robust.sem
#>   Information                                 Expected
#>   Information saturated (h1) model        Unstructured
#> 
#> Latent Variables:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>   GRA =~                                                                
#>     bhv1              0.557    0.046   12.064    0.000    0.557    0.557
#>     bhv2              0.802    0.031   26.165    0.000    0.802    0.802
#>     bhv3              0.773    0.033   23.459    0.000    0.773    0.773
#>   NRA =~                                                                
#>     bhv4              0.922    0.027   34.783    0.000    0.922    0.922
#>     bhv5              0.873    0.028   31.686    0.000    0.873    0.873
#> 
#> Covariances:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>   GRA ~~                                                                
#>     NRA               0.656    0.041   16.001    0.000    0.656    0.656
#> 
#> Thresholds:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>     bhv1|t1          -1.652    0.098  -16.795    0.000   -1.652   -1.652
#>     bhv1|t2          -0.763    0.065  -11.806    0.000   -0.763   -0.763
#>     bhv1|t3           0.003    0.058    0.046    0.963    0.003    0.003
#>     bhv2|t1          -1.278    0.079  -16.167    0.000   -1.278   -1.278
#>     bhv2|t2          -0.024    0.058   -0.416    0.677   -0.024   -0.024
#>     bhv2|t3           0.792    0.065   12.152    0.000    0.792    0.792
#>     bhv3|t1          -1.134    0.074  -15.345    0.000   -1.134   -1.134
#>     bhv3|t2          -0.230    0.059   -3.926    0.000   -0.230   -0.230
#>     bhv3|t3           0.707    0.064   11.105    0.000    0.707    0.707
#>     bhv4|t1          -0.170    0.058   -2.911    0.004   -0.170   -0.170
#>     bhv4|t2           0.588    0.062    9.501    0.000    0.588    0.588
#>     bhv4|t3           1.010    0.070   14.382    0.000    1.010    1.010
#>     bhv5|t1          -0.121    0.058   -2.080    0.038   -0.121   -0.121
#>     bhv5|t2           0.569    0.062    9.231    0.000    0.569    0.569
#>     bhv5|t3           1.065    0.072   14.839    0.000    1.065    1.065
#> 
#> Variances:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>    .bhv1              0.690                               0.690    0.690
#>    .bhv2              0.356                               0.356    0.356
#>    .bhv3              0.403                               0.403    0.403
#>    .bhv4              0.150                               0.150    0.150
#>    .bhv5              0.238                               0.238    0.238
#>     GRA               1.000                               1.000    1.000
#>     NRA               1.000                               1.000    1.000
#> 
#> R-Square:
#>                    Estimate
#>     bhv1              0.310
#>     bhv2              0.644
#>     bhv3              0.597
#>     bhv4              0.850
#>     bhv5              0.762

A.5 Model 5 — Integrated Measurement Model

▶ Show code
summary(fit.all, fit.measures = TRUE, standardized = TRUE, rsquare = TRUE)
#> lavaan 0.6-21 ended normally after 32 iterations
#> 
#>   Estimator                                       DWLS
#>   Optimization method                           NLMINB
#>   Number of model parameters                       165
#> 
#>   Number of observations                           467
#> 
#> Model Test User Model:
#>                                               Standard      Scaled
#>   Test Statistic                               693.769     829.848
#>   Degrees of freedom                               427         427
#>   P-value (Unknown)                                 NA       0.000
#>   Scaling correction factor                                  1.106
#>   Shift parameter                                          202.814
#>     simple second-order correction                                
#> 
#> Model Test Baseline Model:
#> 
#>   Test statistic                             35886.502   12495.677
#>   Degrees of freedom                               496         496
#>   P-value                                           NA       0.000
#>   Scaling correction factor                                  2.949
#> 
#> User Model versus Baseline Model:
#> 
#>   Comparative Fit Index (CFI)                    0.992       0.966
#>   Tucker-Lewis Index (TLI)                       0.991       0.961
#>                                                                   
#>   Robust Comparative Fit Index (CFI)                         0.917
#>   Robust Tucker-Lewis Index (TLI)                            0.903
#> 
#> Root Mean Square Error of Approximation:
#> 
#>   RMSEA                                          0.037       0.045
#>   90 Percent confidence interval - lower         0.032       0.040
#>   90 Percent confidence interval - upper         0.042       0.050
#>   P-value H_0: RMSEA <= 0.050                    1.000       0.965
#>   P-value H_0: RMSEA >= 0.080                    0.000       0.000
#>                                                                   
#>   Robust RMSEA                                               0.064
#>   90 Percent confidence interval - lower                     0.057
#>   90 Percent confidence interval - upper                     0.071
#>   P-value H_0: Robust RMSEA <= 0.050                         0.001
#>   P-value H_0: Robust RMSEA >= 0.080                         0.000
#> 
#> Standardized Root Mean Square Residual:
#> 
#>   SRMR                                           0.053       0.053
#> 
#> Parameter Estimates:
#> 
#>   Parameterization                               Delta
#>   Standard errors                           Robust.sem
#>   Information                                 Expected
#>   Information saturated (h1) model        Unstructured
#> 
#> Latent Variables:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>   Safety_d =~                                                           
#>     safd2             0.751    0.028   26.565    0.000    0.751    0.751
#>     safd3             0.877    0.026   34.273    0.000    0.877    0.877
#>     safd4             0.823    0.027   30.421    0.000    0.823    0.823
#>     safd5             0.816    0.029   28.400    0.000    0.816    0.816
#>   Safety_n =~                                                           
#>     safn2             0.760    0.029   26.153    0.000    0.760    0.760
#>     safn3             0.828    0.026   32.011    0.000    0.828    0.828
#>     safn4             0.757    0.027   28.475    0.000    0.757    0.757
#>     safn5             0.812    0.024   34.105    0.000    0.812    0.812
#>   FCV =~                                                                
#>     fcv1              0.664    0.033   19.842    0.000    0.664    0.664
#>     fcv5              0.830    0.023   36.437    0.000    0.830    0.830
#>     fcv7              0.617    0.034   18.015    0.000    0.617    0.617
#>     fcv3              0.855    0.019   45.922    0.000    0.855    0.855
#>     fcv4              0.887    0.018   49.909    0.000    0.887    0.887
#>   RCV =~                                                                
#>     rcv1              0.662    0.034   19.246    0.000    0.662    0.662
#>     rcv5              0.804    0.022   36.655    0.000    0.804    0.804
#>     rcv7              0.637    0.034   18.989    0.000    0.637    0.637
#>     rcv3              0.815    0.022   37.607    0.000    0.815    0.815
#>     rcv4              0.882    0.016   53.832    0.000    0.882    0.882
#>   SCP =~                                                                
#>     sp7               0.846    0.020   41.602    0.000    0.846    0.846
#>     sp8               0.793    0.026   30.749    0.000    0.793    0.793
#>     sp6               0.768    0.027   28.477    0.000    0.768    0.768
#>     sp9               0.652    0.034   19.330    0.000    0.652    0.652
#>   SAP =~                                                                
#>     sp2               0.738    0.035   20.956    0.000    0.738    0.738
#>     sp1               0.420    0.051    8.274    0.000    0.420    0.420
#>     sp4               0.841    0.027   31.702    0.000    0.841    0.841
#>     sp3               0.635    0.037   17.392    0.000    0.635    0.635
#>     sp5               0.534    0.045   11.880    0.000    0.534    0.534
#>   GRA =~                                                                
#>     bhv1              0.438    0.054    8.117    0.000    0.438    0.438
#>     bhv2              0.912    0.038   23.802    0.000    0.912    0.912
#>     bhv3              0.720    0.039   18.316    0.000    0.720    0.720
#>   NRA =~                                                                
#>     bhv4              0.894    0.027   32.731    0.000    0.894    0.894
#>     bhv5              0.900    0.025   35.965    0.000    0.900    0.900
#> 
#> Covariances:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>  .safd2 ~~                                                              
#>    .safn2             0.198    0.029    6.949    0.000    0.198    0.462
#>  .safd3 ~~                                                              
#>    .safn3             0.155    0.026    5.910    0.000    0.155    0.574
#>  .safd4 ~~                                                              
#>    .safn4             0.189    0.031    6.188    0.000    0.189    0.509
#>  .safd5 ~~                                                              
#>    .safn5             0.265    0.032    8.404    0.000    0.265    0.786
#>  .fcv1 ~~                                                               
#>    .rcv1              0.306    0.032    9.632    0.000    0.306    0.547
#>  .fcv3 ~~                                                               
#>    .rcv3              0.124    0.029    4.346    0.000    0.124    0.413
#>  .fcv4 ~~                                                               
#>    .rcv4              0.091    0.025    3.635    0.000    0.091    0.418
#>  .fcv5 ~~                                                               
#>    .rcv5              0.213    0.026    8.241    0.000    0.213    0.643
#>  .fcv7 ~~                                                               
#>    .rcv7              0.241    0.035    6.866    0.000    0.241    0.397
#>   Safety_d ~~                                                           
#>     Safety_n          0.752    0.030   24.682    0.000    0.752    0.752
#>     FCV               0.362    0.048    7.482    0.000    0.362    0.362
#>     RCV               0.461    0.046   10.061    0.000    0.461    0.461
#>     SCP               0.352    0.048    7.296    0.000    0.352    0.352
#>     SAP               0.302    0.051    5.892    0.000    0.302    0.302
#>     GRA               0.060    0.060    1.009    0.313    0.060    0.060
#>     NRA               0.193    0.054    3.571    0.000    0.193    0.193
#>   Safety_n ~~                                                           
#>     FCV               0.412    0.045    9.181    0.000    0.412    0.412
#>     RCV               0.438    0.046    9.613    0.000    0.438    0.438
#>     SCP               0.363    0.049    7.456    0.000    0.363    0.363
#>     SAP               0.360    0.049    7.370    0.000    0.360    0.360
#>     GRA               0.263    0.056    4.676    0.000    0.263    0.263
#>     NRA               0.478    0.046   10.440    0.000    0.478    0.478
#>   FCV ~~                                                                
#>     RCV               0.572    0.038   14.936    0.000    0.572    0.572
#>     SCP               0.401    0.048    8.381    0.000    0.401    0.401
#>     SAP               0.286    0.051    5.641    0.000    0.286    0.286
#>     GRA               0.257    0.052    4.971    0.000    0.257    0.257
#>     NRA               0.384    0.049    7.863    0.000    0.384    0.384
#>   RCV ~~                                                                
#>     SCP               0.434    0.050    8.736    0.000    0.434    0.434
#>     SAP               0.266    0.053    5.018    0.000    0.266    0.266
#>     GRA               0.114    0.057    1.994    0.046    0.114    0.114
#>     NRA               0.201    0.056    3.592    0.000    0.201    0.201
#>   SCP ~~                                                                
#>     SAP               0.790    0.030   26.162    0.000    0.790    0.790
#>     GRA               0.170    0.055    3.081    0.002    0.170    0.170
#>     NRA               0.179    0.056    3.197    0.001    0.179    0.179
#>   SAP ~~                                                                
#>     GRA               0.089    0.060    1.491    0.136    0.089    0.089
#>     NRA               0.217    0.057    3.802    0.000    0.217    0.217
#>   GRA ~~                                                                
#>     NRA               0.653    0.041   16.036    0.000    0.653    0.653
#> 
#> Thresholds:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>     safd2|t1         -0.219    0.059   -3.741    0.000   -0.219   -0.219
#>     safd2|t2          1.315    0.081   16.327    0.000    1.315    1.315
#>     safd2|t3          2.384    0.183   12.997    0.000    2.384    2.384
#>     safd3|t1          0.192    0.058    3.280    0.001    0.192    0.192
#>     safd3|t2          1.881    0.116   16.193    0.000    1.881    1.881
#>     safd3|t3          2.488    0.205   12.143    0.000    2.488    2.488
#>     safd4|t1         -0.225    0.059   -3.834    0.000   -0.225   -0.225
#>     safd4|t2          1.368    0.083   16.515    0.000    1.368    1.368
#>     safd4|t3          2.301    0.169   13.650    0.000    2.301    2.301
#>     safd5|t1         -0.829    0.066  -12.580    0.000   -0.829   -0.829
#>     safd5|t2          0.476    0.061    7.871    0.000    0.476    0.476
#>     safd5|t3          1.768    0.107   16.575    0.000    1.768    1.768
#>     safn2|t1         -1.123    0.074  -15.275    0.000   -1.123   -1.123
#>     safn2|t2          0.137    0.058    2.357    0.018    0.137    0.137
#>     safn2|t3          1.410    0.085   16.634    0.000    1.410    1.410
#>     safn3|t1         -0.441    0.060   -7.324    0.000   -0.441   -0.441
#>     safn3|t2          0.975    0.069   14.067    0.000    0.975    0.975
#>     safn3|t3          2.069    0.136   15.242    0.000    2.069    2.069
#>     safn4|t1         -1.001    0.070  -14.304    0.000   -1.001   -1.001
#>     safn4|t2          0.280    0.059    4.755    0.000    0.280    0.280
#>     safn4|t3          1.592    0.095   16.836    0.000    1.592    1.592
#>     safn5|t1         -1.175    0.075  -15.617    0.000   -1.175   -1.175
#>     safn5|t2         -0.003    0.058   -0.046    0.963   -0.003   -0.003
#>     safn5|t3          1.154    0.075   15.482    0.000    1.154    1.154
#>     fcv1|t1          -1.074    0.072  -14.914    0.000   -1.074   -1.074
#>     fcv1|t2           0.159    0.058    2.726    0.006    0.159    0.159
#>     fcv1|t3           1.123    0.074   15.275    0.000    1.123    1.123
#>     fcv5|t1          -1.328    0.081  -16.377    0.000   -1.328   -1.328
#>     fcv5|t2          -0.297    0.059   -5.031    0.000   -0.297   -0.297
#>     fcv5|t3           0.892    0.067   13.253    0.000    0.892    0.892
#>     fcv7|t1          -0.792    0.065  -12.152    0.000   -0.792   -0.792
#>     fcv7|t2           0.186    0.058    3.188    0.001    0.186    0.186
#>     fcv7|t3           1.242    0.078   15.995    0.000    1.242    1.242
#>     fcv3|t1          -1.037    0.071  -14.613    0.000   -1.037   -1.037
#>     fcv3|t2           0.030    0.058    0.508    0.611    0.030    0.030
#>     fcv3|t3           1.065    0.072   14.839    0.000    1.065    1.065
#>     fcv4|t1          -1.037    0.071  -14.613    0.000   -1.037   -1.037
#>     fcv4|t2          -0.013    0.058   -0.231    0.817   -0.013   -0.013
#>     fcv4|t3           1.113    0.073   15.204    0.000    1.113    1.113
#>     rcv1|t1          -0.756    0.065  -11.719    0.000   -0.756   -0.756
#>     rcv1|t2           0.792    0.065   12.152    0.000    0.792    0.792
#>     rcv1|t3           1.985    0.126   15.710    0.000    1.985    1.985
#>     rcv5|t1          -1.175    0.075  -15.617    0.000   -1.175   -1.175
#>     rcv5|t2           0.078    0.058    1.340    0.180    0.078    0.078
#>     rcv5|t3           1.396    0.084   16.597    0.000    1.396    1.396
#>     rcv7|t1          -0.600    0.062   -9.681    0.000   -0.600   -0.600
#>     rcv7|t2           0.814    0.066   12.409    0.000    0.814    0.814
#>     rcv7|t3           1.851    0.113   16.312    0.000    1.851    1.851
#>     rcv3|t1          -1.019    0.070  -14.460    0.000   -1.019   -1.019
#>     rcv3|t2           0.633    0.062   10.129    0.000    0.633    0.633
#>     rcv3|t3           1.914    0.119   16.055    0.000    1.914    1.914
#>     rcv4|t1          -0.916    0.068  -13.501    0.000   -0.916   -0.916
#>     rcv4|t2           0.458    0.060    7.598    0.000    0.458    0.458
#>     rcv4|t3           1.822    0.111   16.414    0.000    1.822    1.822
#>     sp7|t1           -0.957    0.069  -13.907    0.000   -0.957   -0.957
#>     sp7|t2            0.094    0.058    1.618    0.106    0.094    0.094
#>     sp7|t3            1.144    0.074   15.414    0.000    1.144    1.144
#>     sp8|t1           -0.714    0.064  -11.193    0.000   -0.714   -0.714
#>     sp8|t2            0.359    0.059    6.042    0.000    0.359    0.359
#>     sp8|t3            1.315    0.081   16.327    0.000    1.315    1.315
#>     sp6|t1           -0.884    0.067  -13.170    0.000   -0.884   -0.884
#>     sp6|t2            0.208    0.059    3.557    0.000    0.208    0.208
#>     sp6|t3            1.175    0.075   15.617    0.000    1.175    1.175
#>     sp9|t1           -0.916    0.068  -13.501    0.000   -0.916   -0.916
#>     sp9|t2            0.143    0.058    2.449    0.014    0.143    0.143
#>     sp9|t3            1.094    0.073   15.060    0.000    1.094    1.094
#>     sp2|t1           -0.423    0.060   -7.050    0.000   -0.423   -0.423
#>     sp2|t2            0.666    0.063   10.574    0.000    0.666    0.666
#>     sp2|t3            1.652    0.098   16.795    0.000    1.652    1.652
#>     sp1|t1           -0.319    0.059   -5.399    0.000   -0.319   -0.319
#>     sp1|t2            0.845    0.066   12.750    0.000    0.845    0.845
#>     sp1|t3            1.368    0.083   16.515    0.000    1.368    1.368
#>     sp4|t1           -1.123    0.074  -15.275    0.000   -1.123   -1.123
#>     sp4|t2           -0.046    0.058   -0.786    0.432   -0.046   -0.046
#>     sp4|t3            1.175    0.075   15.617    0.000    1.175    1.175
#>     sp3|t1           -0.494    0.061   -8.144    0.000   -0.494   -0.494
#>     sp3|t2            0.336    0.059    5.675    0.000    0.336    0.336
#>     sp3|t3            1.186    0.076   15.682    0.000    1.186    1.186
#>     sp5|t1           -0.556    0.061   -9.050    0.000   -0.556   -0.556
#>     sp5|t2            0.494    0.061    8.144    0.000    0.494    0.494
#>     sp5|t3            1.266    0.079   16.111    0.000    1.266    1.266
#>     bhv1|t1          -1.652    0.098  -16.795    0.000   -1.652   -1.652
#>     bhv1|t2          -0.763    0.065  -11.806    0.000   -0.763   -0.763
#>     bhv1|t3           0.003    0.058    0.046    0.963    0.003    0.003
#>     bhv2|t1          -1.278    0.079  -16.167    0.000   -1.278   -1.278
#>     bhv2|t2          -0.024    0.058   -0.416    0.677   -0.024   -0.024
#>     bhv2|t3           0.792    0.065   12.152    0.000    0.792    0.792
#>     bhv3|t1          -1.134    0.074  -15.345    0.000   -1.134   -1.134
#>     bhv3|t2          -0.230    0.059   -3.926    0.000   -0.230   -0.230
#>     bhv3|t3           0.707    0.064   11.105    0.000    0.707    0.707
#>     bhv4|t1          -0.170    0.058   -2.911    0.004   -0.170   -0.170
#>     bhv4|t2           0.588    0.062    9.501    0.000    0.588    0.588
#>     bhv4|t3           1.010    0.070   14.382    0.000    1.010    1.010
#>     bhv5|t1          -0.121    0.058   -2.080    0.038   -0.121   -0.121
#>     bhv5|t2           0.569    0.062    9.231    0.000    0.569    0.569
#>     bhv5|t3           1.065    0.072   14.839    0.000    1.065    1.065
#> 
#> Variances:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>    .safd2             0.436                               0.436    0.436
#>    .safd3             0.232                               0.232    0.232
#>    .safd4             0.322                               0.322    0.322
#>    .safd5             0.335                               0.335    0.335
#>    .safn2             0.423                               0.423    0.423
#>    .safn3             0.315                               0.315    0.315
#>    .safn4             0.426                               0.426    0.426
#>    .safn5             0.341                               0.341    0.341
#>    .fcv1              0.559                               0.559    0.559
#>    .fcv5              0.311                               0.311    0.311
#>    .fcv7              0.619                               0.619    0.619
#>    .fcv3              0.268                               0.268    0.268
#>    .fcv4              0.213                               0.213    0.213
#>    .rcv1              0.561                               0.561    0.561
#>    .rcv5              0.353                               0.353    0.353
#>    .rcv7              0.595                               0.595    0.595
#>    .rcv3              0.336                               0.336    0.336
#>    .rcv4              0.221                               0.221    0.221
#>    .sp7               0.284                               0.284    0.284
#>    .sp8               0.372                               0.372    0.372
#>    .sp6               0.410                               0.410    0.410
#>    .sp9               0.575                               0.575    0.575
#>    .sp2               0.456                               0.456    0.456
#>    .sp1               0.824                               0.824    0.824
#>    .sp4               0.292                               0.292    0.292
#>    .sp3               0.596                               0.596    0.596
#>    .sp5               0.714                               0.714    0.714
#>    .bhv1              0.808                               0.808    0.808
#>    .bhv2              0.169                               0.169    0.169
#>    .bhv3              0.481                               0.481    0.481
#>    .bhv4              0.201                               0.201    0.201
#>    .bhv5              0.190                               0.190    0.190
#>     Safety_d          1.000                               1.000    1.000
#>     Safety_n          1.000                               1.000    1.000
#>     FCV               1.000                               1.000    1.000
#>     RCV               1.000                               1.000    1.000
#>     SCP               1.000                               1.000    1.000
#>     SAP               1.000                               1.000    1.000
#>     GRA               1.000                               1.000    1.000
#>     NRA               1.000                               1.000    1.000
#> 
#> R-Square:
#>                    Estimate
#>     safd2             0.564
#>     safd3             0.768
#>     safd4             0.678
#>     safd5             0.665
#>     safn2             0.577
#>     safn3             0.685
#>     safn4             0.574
#>     safn5             0.659
#>     fcv1              0.441
#>     fcv5              0.689
#>     fcv7              0.381
#>     fcv3              0.732
#>     fcv4              0.787
#>     rcv1              0.439
#>     rcv5              0.647
#>     rcv7              0.405
#>     rcv3              0.664
#>     rcv4              0.779
#>     sp7               0.716
#>     sp8               0.628
#>     sp6               0.590
#>     sp9               0.425
#>     sp2               0.544
#>     sp1               0.176
#>     sp4               0.708
#>     sp3               0.404
#>     sp5               0.286
#>     bhv1              0.192
#>     bhv2              0.831
#>     bhv3              0.519
#>     bhv4              0.799
#>     bhv5              0.810

Citation

APA Style:
Bova, A. (2026). Measurement Properties of Urban Safety Perception Scales Among University Students in Kyiv [Analytical code report]. RPubs. https://rpubs.com/bova/safety-perception-scales

BibTeX entry:

@misc{bova2026,
  author = {Bova, Andrii},
  title  = {{Measurement} {Properties} of {Urban} {Safety} {Perception} {Scales} {Among} {University} {Students} in {Kyiv}},
  year   = {2026},
  note   = {Analytical code report. RPubs},
  url    = {https://rpubs.com/bova/safety-perception-scales}
}

Compiled with R 4.5.2 · lavaan 0.6.21 · Quarto · Document last updated: 03 March 2026