# /******************************************************************
# Scale ID:           HousingConditions
# Scale Name:         Accommodation / Housing conditions
# TILDA Variables:    Accomm1-Accomm20; ProbScale; HProbsScale;
#                     HProbs; PDampMould; PStruct; PNoise; PPest; PHeat
# Dataset:            TILDA Wave 2,3,4
# Author:
# Institution:        The Irish Longitudinal Study on Ageing (TILDA)
#
# Description:
# Generates dichotomous accommodation-problem indicators, a severity
# scale, an overall problem indicator, and grouped housing-problem
# categories.
#
# Version:      1.0
# Date:         2026-09-01
# Language:     R
# ******************************************************************/
#
# Assumption: the working data frame is called `data`.


# ---------------------------------------------------------------
# 1. Dichotomous accommodation problems
# 0 = No problem
# 1 = Problem
# ---------------------------------------------------------------

for (i in 1:20) {
  src <- paste0("SCQAccom", i)
  out <- paste0("Accomm", i)
  x <- data[[src]]

  data[[out]] <- NA_real_
  data[[out]][!is.na(x) & x == 1] <- 0
  data[[out]][!is.na(x) & x >= 2] <- 1
}

# Some routing/error codes indicate presence of the problem
# according to the original Stata scoring code.
data$Accomm1[!is.na(data$SCQAccom1) & data$SCQAccom1 == -823] <- 1
data$Accomm3[!is.na(data$SCQAccom3) & data$SCQAccom3 == -834] <- 1
data$Accomm5[!is.na(data$SCQAccom5) & data$SCQAccom5 == -834] <- 1
data$Accomm9[!is.na(data$SCQAccom9) &
             data$SCQAccom9 %in% c(-834, -823)] <- 1
data$Accomm10[!is.na(data$SCQAccom10) & data$SCQAccom10 == -823] <- 1
data$Accomm15[!is.na(data$SCQAccom15) & data$SCQAccom15 == -834] <- 1
data$Accomm16[!is.na(data$SCQAccom16) & data$SCQAccom16 == -834] <- 1
data$Accomm18[!is.na(data$SCQAccom18) & data$SCQAccom18 == -823] <- 1

for (i in 1:20) {
  attr(data[[paste0("Accomm", i)]], "labels") <-
    c("No problem" = 0, "Problem" = 1)
}


# ---------------------------------------------------------------
# 2. Number of accommodation problems
# Original code uses Items 1-19
# ---------------------------------------------------------------

accomm_1_19 <- paste0("Accomm", 1:19)

data$AccommProbs1 <- rowSums(data[accomm_1_19], na.rm = TRUE)
accomm_missing <- rowSums(is.na(data[accomm_1_19]))
data$AccommProbs1[accomm_missing > 0] <- NA_real_

attr(data$AccommProbs1, "label") <- "Number of accommodation problems"


# ---------------------------------------------------------------
# 3. Accommodation problem severity items
# 1->0, 2->1, 3->2, 4->3
# ---------------------------------------------------------------

for (i in 1:20) {
  src <- paste0("SCQAccom", i)
  out <- paste0("AccommP", i)
  x <- data[[src]]

  data[[out]] <- NA_real_
  valid <- !is.na(x) & x >= 1 & x <= 4
  data[[out]][valid] <- x[valid] - 1
}


# ---------------------------------------------------------------
# 4. Overall accommodation problem severity scale
# Original scale uses Items 1-19; range 0-57
# ---------------------------------------------------------------

accommp_1_19 <- paste0("AccommP", 1:19)

data$ProbScale <- rowSums(data[accommp_1_19], na.rm = TRUE)
prob_missing <- rowSums(is.na(data[accommp_1_19]))
data$ProbScale[prob_missing > 0] <- NA_real_

attr(data$ProbScale, "label") <-
  "Accommodation problems severity scale (0-57)"


# ---------------------------------------------------------------
# 5. Categorical accommodation problem scale
# ---------------------------------------------------------------

data$HProbsScale <- NA_real_
data$HProbsScale[!is.na(data$ProbScale) & data$ProbScale == 0] <- 0
data$HProbsScale[!is.na(data$ProbScale) &
                 data$ProbScale >= 1 & data$ProbScale <= 2] <- 1
data$HProbsScale[!is.na(data$ProbScale) &
                 data$ProbScale >= 3 & data$ProbScale <= 57] <- 2

attr(data$HProbsScale, "label") <- "Accommodation problem categories"
attr(data$HProbsScale, "labels") <- c(
  "None" = 0,
  "One or two minor" = 1,
  "A few or more" = 2
)


# ---------------------------------------------------------------
# 6. Any accommodation problem
# Missing only if all 20 indicators are missing
# ---------------------------------------------------------------

rowmax_na <- function(df) {
  out <- apply(df, 1, function(x) {
    if (all(is.na(x))) NA_real_ else max(x, na.rm = TRUE)
  })
  as.numeric(out)
}

data$HProbs <- rowmax_na(data[paste0("Accomm", 1:20)])

attr(data$HProbs, "label") <- "Any accommodation problem"
attr(data$HProbs, "labels") <- c(
  "No accommodation problems" = 0,
  "Any problems" = 1
)


# ---------------------------------------------------------------
# 7. Accommodation problem categories
# ---------------------------------------------------------------

data$PDampMould <- rowmax_na(
  data[c(paste0("Accomm", 1:8), "Accomm12")]
)

data$PStruct <- rowmax_na(
  data[c(paste0("Accomm", 9:11), paste0("Accomm", 13:16))]
)

data$PNoise <- data$Accomm18
data$PPest  <- data$Accomm17
data$PHeat  <- data$Accomm19

attr(data$PDampMould, "label") <- "Moisture, damp or mould"
attr(data$PStruct, "label") <- "Structural"
attr(data$PNoise, "label") <- "Noise"
attr(data$PPest, "label") <- "Pests"
attr(data$PHeat, "label") <- "Heating"

problem_labels <- c("No problem" = 0, "Problem" = 1)
attr(data$PDampMould, "labels") <- problem_labels
attr(data$PStruct, "labels") <- problem_labels
attr(data$PNoise, "labels") <- problem_labels
attr(data$PPest, "labels") <- problem_labels
attr(data$PHeat, "labels") <- c(
  "No heating difficulties" = 0,
  "Any heating difficulties" = 1
)


# ---------------------------------------------------------------
# Checks
# ---------------------------------------------------------------

summary(data[c("AccommProbs1", "ProbScale")])
table(data$HProbsScale, useNA = "ifany")
table(data$HProbs, useNA = "ifany")
table(data$PDampMould, useNA = "ifany")
table(data$PStruct, useNA = "ifany")
table(data$PNoise, useNA = "ifany")
table(data$PPest, useNA = "ifany")
table(data$PHeat, useNA = "ifany")
