Rmd Faylında Mətn Ölçüsünü Böyütmə Üsulları 1. ÜSUL: CSS Style Əlavə Etmək YAML header-ə CSS əlavə edin: yaml— title: “Bölmə 4: IRT Əsasları - Parametr Yaradılması” subtitle: “Kompüter Adaptiv Testləşmə (CAT) Tədrisi” author: “CAT Tədrisi” date: “2025-07-12” output: html_document: toc: true toc_float: true theme: flatly highlight: tango number_sections: true css: style.css pdf_document: toc: true number_sections: true —
Item Response Theory (IRT) CAT sistemlərinin riyazi əsasını təşkil edir. Bu bölmədə IRT parametrlərinin necə yaradıldığını və interpretasiya edildiyini öyrənəcəksiniz. IRT parametrləri test tapşırıqlarının xarakteristikalarını riyazi olaraq təsvir edir.
IRT modellərində hər tapşırıq üç əsas parametrlə xarakterizə olunur: çətinlik (b), ayrıd edicilik (a), və təsadüfi doğru cavablama (c) parametrləri.
IRT-nin ən geniş istifadə olunan modeli 3-parametr logistik modeldir:
\[P(\theta) = c + \frac{1-c}{1 + e^{-a(\theta - b)}}\]
Bu tənlikdə:
θ (theta): Test alıcısının qabiliyyət səviyyəsi
a: Ayrıd edicilik parametri
b: Çətinlik parametri
c: Təsadüfi doğru cavablama parametri
# IRT əyrisinin vizuallaşdırılması
plot_icc <- function(a, b, c, theta_range = c(-4, 4)) {
theta <- seq(theta_range[1], theta_range[2], by = 0.1)
p_theta <- c + (1 - c) / (1 + exp(-a * (theta - b)))
plot_data <- data.frame(theta = theta, probability = p_theta)
ggplot(plot_data, aes(x = theta, y = probability)) +
geom_line(size = 1.2, color = "blue") +
labs(
title = paste("Item Xarakteristik Əyrisi"),
subtitle = paste("a =", a, ", b =", b, ", c =", round(c, 3)),
x = "Qabiliyyət Səviyyəsi (θ)",
y = "Doğru Cavab Ehtimalı"
) +
ylim(0, 1) +
theme_minimal() +
geom_hline(yintercept = 0.5, linetype = "dashed", alpha = 0.5) +
geom_vline(xintercept = b, linetype = "dashed", alpha = 0.5, color = "red")
}
# Nümunə ICC
plot_icc(a = 1.5, b = 0.5, c = 0.2)
# IRT parametrlərinin yaradılması
create_irt_params <- function(n_items = 100,
difficulty_mean = 0,
difficulty_sd = 1,
discrimination_meanlog = 0,
discrimination_sdlog = 0.3,
guessing_alpha = 2,
guessing_beta = 6) {
# Çətinlik parametrləri - normal paylanma
difficulty <- rnorm(n_items, mean = difficulty_mean, sd = difficulty_sd)
# Ayrıd edicilik parametrləri - log-normal paylanma
discrimination <- rlnorm(n_items, meanlog = discrimination_meanlog,
sdlog = discrimination_sdlog)
# Təsadüfi doğru cavab parametrləri - beta paylanma
guessing <- rbeta(n_items, guessing_alpha, guessing_beta)
# Parametrləri birləşdir
item_params <- data.frame(
item_id = 1:n_items,
a = discrimination,
b = difficulty,
c = guessing
)
return(item_params)
}
# Nümunə parametrlər yaradın
set.seed(12345) # Təkrarlanabilir nəticələr üçün
sample_params <- create_irt_params(10)
print(sample_params)
## item_id a b c
## 1 1 0.9657268 0.5855288 0.42172455
## 2 2 1.7249423 0.7094660 0.14929394
## 3 3 1.1176054 -0.1093033 0.05833425
## 4 4 1.1689021 -0.4534972 0.05522793
## 5 5 0.7983888 0.6058875 0.17161117
## 6 6 1.2777107 -1.8179560 0.38183783
## 7 7 0.7665102 0.6300986 0.37983677
## 8 8 0.9053141 -0.2761841 0.22141943
## 9 9 1.3996382 -0.2841597 0.43009552
## 10 10 1.0937554 -0.9193220 0.66552512
# Daha böyük parametr dəsti yaradın
set.seed(12345)
full_params <- create_irt_params(100)
# Tanımlayıcı statistikalar
cat("=== IRT PARAMETR STATİSTİKALARI ===\n")
## === IRT PARAMETR STATİSTİKALARI ===
## Ayrıd edicilik (a) parametri:
## Orta: 1.062
## Standart sapma: 0.335
## Aralıq: 0.529 - 2.218
## Çətinlik (b) parametri:
## Orta: 0.245
## Standart sapma: 1.115
## Aralıq: -2.38 - 2.477
## Təsadüfi cavablama (c) parametri:
## Orta: 0.251
## Standart sapma: 0.129
## Aralıq: 0.021 - 0.636
# Parametr paylanmalarını göstər
library(gridExtra)
# Ayrıd edicilik parametri
p1 <- ggplot(full_params, aes(x = a)) +
geom_histogram(bins = 20, fill = "lightblue", color = "black", alpha = 0.7) +
geom_density(aes(y = ..scaled.. * max(..count..)), color = "red", size = 1) +
labs(title = "Ayrıd Edicilik (a) Parametri",
x = "Ayrıd Edicilik", y = "Tezlik") +
theme_minimal()
# Çətinlik parametri
p2 <- ggplot(full_params, aes(x = b)) +
geom_histogram(bins = 20, fill = "lightgreen", color = "black", alpha = 0.7) +
geom_density(aes(y = ..scaled.. * max(..count..)), color = "red", size = 1) +
labs(title = "Çətinlik (b) Parametri",
x = "Çətinlik", y = "Tezlik") +
theme_minimal()
# Təsadüfi cavablama parametri
p3 <- ggplot(full_params, aes(x = c)) +
geom_histogram(bins = 20, fill = "lightyellow", color = "black", alpha = 0.7) +
geom_density(aes(y = ..scaled.. * max(..count..)), color = "red", size = 1) +
labs(title = "Təsadüfi Cavablama (c) Parametri",
x = "Təsadüfi Cavablama", y = "Tezlik") +
theme_minimal()
# Bütün qrafikleri birləşdir
grid.arrange(p1, p2, p3, ncol = 1)
# Ayrıd edicilik səviyyələri
interpret_discrimination <- function(a_values) {
interpretation <- ifelse(a_values < 0.5, "Çox aşağı",
ifelse(a_values < 1.0, "Aşağı",
ifelse(a_values < 1.5, "Orta",
ifelse(a_values < 2.0, "Yüksək", "Çox yüksək"))))
return(interpretation)
}
# Ayrıd edicilik təhlili
discrimination_analysis <- full_params %>%
mutate(
a_category = interpret_discrimination(a),
a_rounded = round(a, 2)
) %>%
count(a_category) %>%
mutate(percentage = round(n / sum(n) * 100, 1))
cat("=== AYRID EDİCİLİK KATEQORİYALARI ===\n")
## === AYRID EDİCİLİK KATEQORİYALARI ===
for(i in 1:nrow(discrimination_analysis)) {
cat(discrimination_analysis$a_category[i], ":",
discrimination_analysis$n[i], "tapşırıq (",
discrimination_analysis$percentage[i], "%)\n")
}
## Aşağı : 48 tapşırıq ( 48 %)
## Orta : 42 tapşırıq ( 42 %)
## Yüksək : 8 tapşırıq ( 8 %)
## Çox yüksək : 2 tapşırıq ( 2 %)
# Çətinlik səviyyələri
interpret_difficulty <- function(b_values) {
interpretation <- ifelse(b_values < -2, "Çox asan",
ifelse(b_values < -1, "Asan",
ifelse(b_values < 0, "Orta-asan",
ifelse(b_values < 1, "Orta-çətin",
ifelse(b_values < 2, "Çətin", "Çox çətin")))))
return(interpretation)
}
# Çətinlik təhlili
difficulty_analysis <- full_params %>%
mutate(
b_category = interpret_difficulty(b),
b_rounded = round(b, 2)
) %>%
count(b_category) %>%
mutate(percentage = round(n / sum(n) * 100, 1))
cat("\n=== ÇƏTİNLİK KATEQORİYALARI ===\n")
##
## === ÇƏTİNLİK KATEQORİYALARI ===
for(i in 1:nrow(difficulty_analysis)) {
cat(difficulty_analysis$b_category[i], ":",
difficulty_analysis$n[i], "tapşırıq (",
difficulty_analysis$percentage[i], "%)\n")
}
## Asan : 11 tapşırıq ( 11 %)
## Orta-asan : 27 tapşırıq ( 27 %)
## Orta-çətin : 38 tapşırıq ( 38 %)
## Çox asan : 2 tapşırıq ( 2 %)
## Çox çətin : 6 tapşırıq ( 6 %)
## Çətin : 16 tapşırıq ( 16 %)
# Təsadüfi cavablama təhlili
interpret_guessing <- function(c_values) {
interpretation <- ifelse(c_values < 0.1, "Çox aşağı",
ifelse(c_values < 0.2, "Aşağı",
ifelse(c_values < 0.3, "Orta",
ifelse(c_values < 0.4, "Yüksək", "Çox yüksək"))))
return(interpretation)
}
guessing_analysis <- full_params %>%
mutate(
c_category = interpret_guessing(c),
c_rounded = round(c, 3)
) %>%
count(c_category) %>%
mutate(percentage = round(n / sum(n) * 100, 1))
cat("\n=== TƏSADÜFI CAVABLAMA KATEQORİYALARI ===\n")
##
## === TƏSADÜFI CAVABLAMA KATEQORİYALARI ===
for(i in 1:nrow(guessing_analysis)) {
cat(guessing_analysis$c_category[i], ":",
guessing_analysis$n[i], "tapşırıq (",
guessing_analysis$percentage[i], "%)\n")
}
## Aşağı : 28 tapşırıq ( 28 %)
## Orta : 29 tapşırıq ( 29 %)
## Yüksək : 19 tapşırıq ( 19 %)
## Çox aşağı : 10 tapşırıq ( 10 %)
## Çox yüksək : 14 tapşırıq ( 14 %)
# Müxtəlif parametrlərlə ICC əyrilərini müqayisə edin
compare_icc_curves <- function() {
theta <- seq(-4, 4, by = 0.1)
# Müxtəlif parametr dəstləri
params_list <- list(
list(a = 0.5, b = 0, c = 0.2, label = "Aşağı ayrıd edicilik"),
list(a = 1.5, b = 0, c = 0.2, label = "Yüksək ayrıd edicilik"),
list(a = 1.0, b = -1, c = 0.2, label = "Asan tapşırıq"),
list(a = 1.0, b = 1, c = 0.2, label = "Çətin tapşırıq"),
list(a = 1.0, b = 0, c = 0.1, label = "Aşağı təsadüfi cavab"),
list(a = 1.0, b = 0, c = 0.3, label = "Yüksək təsadüfi cavab")
)
# Bütün əyriləri hesablayın
all_curves <- data.frame()
for(i in 1:length(params_list)) {
params <- params_list[[i]]
p_theta <- params$c + (1 - params$c) / (1 + exp(-params$a * (theta - params$b)))
curve_data <- data.frame(
theta = theta,
probability = p_theta,
curve = params$label
)
all_curves <- rbind(all_curves, curve_data)
}
# Qrafik yaradın
ggplot(all_curves, aes(x = theta, y = probability, color = curve)) +
geom_line(size = 1.2) +
labs(
title = "Müxtəlif IRT Parametrləri ilə ICC Əyriləri",
x = "Qabiliyyət Səviyyəsi (θ)",
y = "Doğru Cavab Ehtimalı",
color = "Parametr Növü"
) +
theme_minimal() +
theme(legend.position = "bottom") +
guides(color = guide_legend(nrow = 3))
}
compare_icc_curves()
# Adaptiv test üçün optimal parametr yaradma
create_adaptive_params <- function(n_items = 100, theta_range = c(-3, 3)) {
# Çətinlik parametrlərini theta aralığına görə paylaşdırın
target_difficulties <- seq(theta_range[1], theta_range[2],
length.out = n_items)
# Kiçik təsadüfi variasiya əlavə edin
difficulties <- target_difficulties + rnorm(n_items, 0, 0.3)
# Yüksək ayrıd edicilik parametrləri
discriminations <- rlnorm(n_items, meanlog = 0.2, sdlog = 0.2)
# Minimum 0.8, maksimum 3.0 məhdudiyyəti
discriminations <- pmax(0.8, pmin(3.0, discriminations))
# Aşağı təsadüfi cavablama
guessing <- rbeta(n_items, 3, 12) # Ortalama ~0.2
params <- data.frame(
item_id = 1:n_items,
a = discriminations,
b = difficulties,
c = guessing
)
return(params)
}
# Adaptiv parametrlər yaradın
adaptive_params <- create_adaptive_params(50)
# Qarşılaşdırma
cat("=== ADAPTİV PARAMETR MÜQAYİSƏSİ ===\n")
## === ADAPTİV PARAMETR MÜQAYİSƏSİ ===
## Standart parametrlər:
cat(" a orta:", round(mean(full_params$a[1:50]), 3),
", b orta:", round(mean(full_params$b[1:50]), 3),
", c orta:", round(mean(full_params$c[1:50]), 3), "\n")
## a orta: 1.054 , b orta: 0.18 , c orta: 0.263
## Adaptiv parametrlər:
cat(" a orta:", round(mean(adaptive_params$a), 3),
", b orta:", round(mean(adaptive_params$b), 3),
", c orta:", round(mean(adaptive_params$c), 3), "\n")
## a orta: 1.268 , b orta: 0.073 , c orta: 0.223
# Məzmun sahələrinə görə parametr yaradma
create_content_based_params <- function() {
# Məzmun sahələri təyin edin
content_areas <- c("Ədəd", "Cəbr", "Həndəsə", "Ehtimal")
items_per_area <- 25
all_params <- data.frame()
for(i in 1:length(content_areas)) {
area <- content_areas[i]
# Hər sahə üçün xüsusi parametr xarakteristikaları
if(area == "Ədəd") {
# Ədəd: orta çətinlik, yüksək ayrıd edicilik
b_params <- list(mean = -0.5, sd = 0.8)
a_params <- list(meanlog = 0.3, sdlog = 0.25)
} else if(area == "Cəbr") {
# Cəbr: yüksək çətinlik, orta ayrıd edicilik
b_params <- list(mean = 0.5, sd = 1.0)
a_params <- list(meanlog = 0.1, sdlog = 0.3)
} else if(area == "Həndəsə") {
# Həndəsə: geniş çətinlik aralığı
b_params <- list(mean = 0, sd = 1.2)
a_params <- list(meanlog = 0.2, sdlog = 0.3)
} else { # Ehtimal
# Ehtimal: yüksək çətinlik, aşağı ayrıd edicilik
b_params <- list(mean = 1.0, sd = 0.8)
a_params <- list(meanlog = -0.1, sdlog = 0.4)
}
# Parametrləri yaradın
area_params <- data.frame(
item_id = ((i-1) * items_per_area + 1):(i * items_per_area),
content_area = area,
a = rlnorm(items_per_area, a_params$meanlog, a_params$sdlog),
b = rnorm(items_per_area, b_params$mean, b_params$sd),
c = rbeta(items_per_area, 2, 8)
)
all_params <- rbind(all_params, area_params)
}
return(all_params)
}
# Məzmun əsaslı parametrlər
content_params <- create_content_based_params()
# Məzmun sahələrinə görə təhlil
content_summary <- content_params %>%
group_by(content_area) %>%
summarise(
n_items = n(),
a_mean = round(mean(a), 3),
b_mean = round(mean(b), 3),
c_mean = round(mean(c), 3),
.groups = 'drop'
)
cat("\n=== MƏZMUN SAHƏLƏRİNƏ GÖRƏ PARAMETRLƏR ===\n")
##
## === MƏZMUN SAHƏLƏRİNƏ GÖRƏ PARAMETRLƏR ===
## # A tibble: 4 × 5
## content_area n_items a_mean b_mean c_mean
## <chr> <int> <dbl> <dbl> <dbl>
## 1 Cəbr 25 1.29 0.401 0.206
## 2 Ehtimal 25 0.967 1.09 0.221
## 3 Həndəsə 25 1.35 -0.027 0.199
## 4 Ədəd 25 1.28 -0.789 0.22
# Parametr keyfiyyətini yoxlayın
quality_check <- function(params) {
issues <- c()
# Ayrıd edicilik yoxlaması
low_discrimination <- sum(params$a < 0.5)
if(low_discrimination > nrow(params) * 0.1) {
issues <- c(issues, paste("Çox aşağı ayrıd edicilik:", low_discrimination, "tapşırıq"))
}
# Çətinlik yoxlaması
extreme_difficulty <- sum(abs(params$b) > 3)
if(extreme_difficulty > nrow(params) * 0.05) {
issues <- c(issues, paste("Həddindən artıq çətinlik:", extreme_difficulty, "tapşırıq"))
}
# Təsadüfi cavablama yoxlaması
high_guessing <- sum(params$c > 0.4)
if(high_guessing > nrow(params) * 0.05) {
issues <- c(issues, paste("Çox yüksək təsadüfi cavab:", high_guessing, "tapşırıq"))
}
# Nəticələr
if(length(issues) == 0) {
cat("✅ Parametr keyfiyyəti yaxşıdır\n")
return(TRUE)
} else {
cat("⚠️ Parametr problemləri:\n")
for(issue in issues) {
cat(" -", issue, "\n")
}
return(FALSE)
}
}
# Keyfiyyət yoxlaması
cat("Standart parametrlər:\n")
## Standart parametrlər:
## ⚠️ Parametr problemləri:
## - Çox yüksək təsadüfi cavab: 14 tapşırıq
## [1] FALSE
##
## Adaptiv parametrlər:
## ⚠️ Parametr problemləri:
## - Çox yüksək təsadüfi cavab: 3 tapşırıq
## [1] FALSE
##
## Məzmun əsaslı parametrlər:
## ✅ Parametr keyfiyyəti yaxşıdır
## [1] TRUE
Bu bölmədə IRT parametrlərinin yaradılması və interpretasiyasını öyrəndik. Keyfiyyətli IRT parametrləri CAT sistemlərinin effektiv işləməsi üçün əsasdır.
Bölmə 5: Real Verilənlərdən IRT Parametrlərinin Qiymətləndirilməsi
Bölmə 6: Item Bankının Yaradılması və İdarə Edilməsi
Bölmə 7: CAT Simulyasiyalarının Aparılması
Qeyd: Bu bölmədə yaradılan parametrlər simulyasiya məqsədləri üçündür. Real CAT sistemləri üçün empirik verilənlərdən qiymətləndirilmiş parametrlər istifadə edilməlidir.