# Dane demonstracyjne. W realnym badaniu wczytaj surowy, niezmieniony plik.
dane <- data.frame(
  id = 1:10,
  sr1 = c(4, 3, 5, 2, 4, 1, 3, 5, 2, 4),
  sr2 = c(4, 4, 5, 3, NA, 2, 3, 4, 2, 5),
  sr3 = c(2, 2, 1, 4, 2, 5, 3, 1, 4, 2), # pozycja odwrócona
  sr4 = c(5, 4, 5, 2, 4, 1, 4, 5, 3, 4),
  zajecia_planowane = c(10, 10, 10, 10, 10, 10, 10, 10, 0, 10),
  zajecia_obecne = c(9, 8, 10, 6, 8, 4, 7, 9, 0, 11),
  wynik_egzaminu = c(88, 79, 95, 62, 82, 48, 73, 91, 67, 86)
)

# 1. Kontrola zakresu pozycji przed utworzeniem wyniku.
pozycje <- c("sr1", "sr2", "sr3", "sr4")
poza_zakresem <- sapply(dane[pozycje], function(x) any(!is.na(x) & !(x %in% 1:5)))
if (any(poza_zakresem)) stop("Pozycje skali zawierają wartości spoza zakresu 1–5.")

# 2. Rekodowanie zgodne z kluczem: dla skali 1–5 wynik odwrócony = 6 - wynik.
dane$sr3_r <- 6 - dane$sr3
pozycje_po_kluczu <- c("sr1", "sr2", "sr3_r", "sr4")

# 3. Wynik jest średnią tylko wtedy, gdy dostępne są co najmniej 3 z 4 pozycji.
dane$liczba_waznych_pozycji <- rowSums(!is.na(dane[pozycje_po_kluczu]))
dane$samoregulacja <- rowMeans(dane[pozycje_po_kluczu], na.rm = TRUE)
dane$samoregulacja[dane$liczba_waznych_pozycji < 3] <- NA_real_

# 4. Frekwencja ma sens tylko przy dodatnim mianowniku i liczniku 0...mianownik.
poprawna_frekwencja <- with(
  dane,
  zajecia_planowane > 0 & zajecia_obecne >= 0 & zajecia_obecne <= zajecia_planowane
)
dane$frekwencja <- ifelse(
  poprawna_frekwencja,
  dane$zajecia_obecne / dane$zajecia_planowane,
  NA_real_
)
dane$blad_frekwencji <- !poprawna_frekwencja

alfa_cronbacha <- function(x) {
  # Alfa dla kompletnych wierszy; nie zastępuje oceny modelu pomiarowego.
  x <- na.omit(x)
  k <- ncol(x)
  k / (k - 1) * (1 - sum(vapply(x, var, numeric(1))) / var(rowSums(x)))
}

alpha <- alfa_cronbacha(dane[pozycje_po_kluczu])

print(
  dane[c(
    "id", "sr3", "sr3_r", "liczba_waznych_pozycji",
    "samoregulacja", "frekwencja", "blad_frekwencji"
  )],
  row.names = FALSE
)
cat(sprintf("\nAlfa Cronbacha (wiersze kompletne): %.3f\n", alpha))
cat("Liczba rekordów wymagających kontroli frekwencji:", sum(dane$blad_frekwencji), "\n")

