Expected A Posteriori (EAP) qabiliyyət qiymətləndirmə CAT sistemlərində ən güvənilir və stabil metodlardan biridir. MLE metodundan fərqli olaraq, EAP Bayesian yanaşma istifadə edir və ekstrem cavab nümunələrində daha robust performans göstərir.
EAP metodu prior məlumatı likelihood ilə birləşdirərək posterior paylanması yaradır və bu paylanmanın ortalamasını qabiliyyət qiymətləndirilməsi kimi istifadə edir. Bu yanaşma xüsusilə CAT-ın erkən mərhələlərində və az tapşırıq cavablandırıldığında üstünlük təşkil edir.
# EAP metodunun nəzəri əsaslarını izah edək
explain_eap_theory <- function() {
cat("=== EAP (EXPECTED A POSTERIORI) NƏZƏRİYYƏSİ ===\n\n")
cat("EAP metodu Bayesian statistikanın tətbiqidir:\n\n")
cat("1. BAYES TEOREMİ:\n")
cat(" P(θ|X) ∝ P(X|θ) × P(θ)\n")
cat(" Burada:\n")
cat(" • P(θ|X) = Posterior paylanma\n")
cat(" • P(X|θ) = Likelihood (cavab nümunəsi ehtimalı)\n")
cat(" • P(θ) = Prior paylanma\n\n")
cat("2. EAP QİYMƏTLƏNDİRMƏ:\n")
cat(" θ̂_EAP = ∫ θ × P(θ|X) dθ\n")
cat(" (Posterior paylanmanın ortalaması)\n\n")
cat("3. POSTERIOR STANDART XƏTA:\n")
cat(" SE_EAP = √[∫ (θ - θ̂_EAP)² × P(θ|X) dθ]\n\n")
cat("4. EAP ÜSTÜNLÜKLƏRİ:\n")
cat(" ✓ Həmişə məhdud qiymət verir\n")
cat(" ✓ Ekstrem cavab nümunələrində robust\n")
cat(" ✓ Az tapşırıqla effektiv işləyir\n")
cat(" ✓ Uncertainty-ni tam ölçür\n")
cat(" ✓ Prior məlumatı əlavə edə bilir\n\n")
cat("5. MLE ilə MÜQAYİSƏ:\n")
cat(" • MLE: P(X|θ)-ni maksimallaşdırır\n")
cat(" • EAP: P(θ|X)-in ortalamasını hesablayır\n")
cat(" • EAP daha konservativ və stabil\n")
return(invisible(NULL))
}
explain_eap_theory()
## === EAP (EXPECTED A POSTERIORI) NƏZƏRİYYƏSİ ===
##
## EAP metodu Bayesian statistikanın tətbiqidir:
##
## 1. BAYES TEOREMİ:
## P(θ|X) ∝ P(X|θ) × P(θ)
## Burada:
## • P(θ|X) = Posterior paylanma
## • P(X|θ) = Likelihood (cavab nümunəsi ehtimalı)
## • P(θ) = Prior paylanma
##
## 2. EAP QİYMƏTLƏNDİRMƏ:
## θ̂_EAP = ∫ θ × P(θ|X) dθ
## (Posterior paylanmanın ortalaması)
##
## 3. POSTERIOR STANDART XƏTA:
## SE_EAP = √[∫ (θ - θ̂_EAP)² × P(θ|X) dθ]
##
## 4. EAP ÜSTÜNLÜKLƏRİ:
## ✓ Həmişə məhdud qiymət verir
## ✓ Ekstrem cavab nümunələrində robust
## ✓ Az tapşırıqla effektiv işləyir
## ✓ Uncertainty-ni tam ölçür
## ✓ Prior məlumatı əlavə edə bilir
##
## 5. MLE ilə MÜQAYİSƏ:
## • MLE: P(X|θ)-ni maksimallaşdırır
## • EAP: P(θ|X)-in ortalamasını hesablayır
## • EAP daha konservativ və stabil
# Expected A Posteriori (EAP) metodu
estimate_ability_eap <- function(item_indices, responses, item_bank,
prior_mean = 0, prior_sd = 1,
theta_range = c(-4, 4), n_points = 81) {
# Theta aralığı (quadrature points)
theta_points <- seq(theta_range[1], theta_range[2], length.out = n_points)
# Likelihood hesablanması
likelihood <- sapply(theta_points, function(theta) {
total_loglik <- 0
for (i in 1:length(item_indices)) {
item_idx <- item_indices[i]
a <- item_bank$a[item_idx]
b <- item_bank$b[item_idx]
c <- item_bank$c[item_idx]
# 3PL model ehtimalı
P <- c + (1 - c) * plogis(a * (theta - b))
P <- pmax(1e-10, pmin(1 - 1e-10, P)) # Numerical stability
if (responses[i] == 1) {
total_loglik <- total_loglik + log(P)
} else {
total_loglik <- total_loglik + log(1 - P)
}
}
return(exp(total_loglik))
})
# Numerical stability üçün likelihood-i normalize et
likelihood <- likelihood / max(likelihood)
# Prior paylanma
prior <- dnorm(theta_points, prior_mean, prior_sd)
# Posterior paylanma (unnormalized)
posterior_unnorm <- likelihood * prior
# Posterior normalizasiyası
if(sum(posterior_unnorm) > 0) {
posterior <- posterior_unnorm / sum(posterior_unnorm)
} else {
# Əgər posterior 0-sa, prior-ı istifadə et
posterior <- prior / sum(prior)
}
# EAP qiymətləndirmə (posterior ortalaması)
theta_eap <- sum(theta_points * posterior)
# Posterior variansı və standart xəta
theta_var <- sum((theta_points - theta_eap)^2 * posterior)
se_eap <- sqrt(theta_var)
# Modal qiymətləndirmə (MAP)
theta_map <- theta_points[which.max(posterior)]
# Credible interval (95%)
cumulative_posterior <- cumsum(posterior)
ci_lower_idx <- which(cumulative_posterior >= 0.025)[1]
ci_upper_idx <- which(cumulative_posterior >= 0.975)[1]
ci_lower <- theta_points[ci_lower_idx]
ci_upper <- theta_points[ci_upper_idx]
return(list(
theta_eap = theta_eap,
theta_map = theta_map,
se_eap = se_eap,
ci_lower = ci_lower,
ci_upper = ci_upper,
posterior = posterior,
likelihood = likelihood,
prior = prior,
theta_points = theta_points
))
}
# Test bank yaradımı (əgər yoxdursa)
if(!exists("item_bank")) {
set.seed(12345)
item_bank <- data.frame(
item_id = 1:50,
a = runif(50, 0.8, 2.5),
b = rnorm(50, 0, 1.2),
c = runif(50, 0.1, 0.25)
)
}
# Nümunə qiymətləndirmə
sample_items <- c(1, 5, 10)
sample_responses <- c(1, 0, 1)
ability_est <- estimate_ability_eap(sample_items, sample_responses, item_bank)
cat("=== EAP QİYMƏTLƏNDİRMƏ NƏTİCƏLƏRİ ===\n")
## === EAP QİYMƏTLƏNDİRMƏ NƏTİCƏLƏRİ ===
## EAP qiymətləndirmə: -0.109
## MAP qiymətləndirmə: 0.1
## Standart xəta: 0.904
cat("95% Credible Interval: [", round(ability_est$ci_lower, 3), ", ",
round(ability_est$ci_upper, 3), "]\n")
## 95% Credible Interval: [ -2 , 1.6 ]
# EAP posterior paylanmasının vizuallaşdırılması
visualize_eap_posterior <- function(eap_result, title_suffix = "") {
# Məlumatları data frame-ə çevir
viz_data <- data.frame(
theta = eap_result$theta_points,
posterior = eap_result$posterior,
likelihood = eap_result$likelihood / max(eap_result$likelihood), # Normalize
prior = eap_result$prior / max(eap_result$prior) # Normalize
)
# Uzun format
viz_long <- viz_data %>%
select(theta, posterior, likelihood, prior) %>%
tidyr::pivot_longer(cols = -theta, names_to = "Distribution", values_to = "Density")
# Ana plot
p1 <- ggplot(viz_long, aes(x = theta, y = Density, color = Distribution)) +
geom_line(size = 1.2) +
geom_area(data = viz_data, aes(x = theta, y = posterior),
alpha = 0.3, fill = "blue", inherit.aes = FALSE) +
geom_vline(xintercept = eap_result$theta_eap, linetype = "dashed",
color = "red", size = 1) +
geom_vline(xintercept = eap_result$theta_map, linetype = "dotted",
color = "darkred", size = 1) +
labs(title = paste("EAP Posterior Paylanması", title_suffix),
subtitle = paste("EAP =", round(eap_result$theta_eap, 3),
"| MAP =", round(eap_result$theta_map, 3),
"| SE =", round(eap_result$se_eap, 3)),
x = "Qabiliyyət (θ)", y = "Normallaşdırılmış Sıxlıq",
color = "Paylanma") +
theme_minimal() +
scale_color_manual(values = c("posterior" = "blue", "likelihood" = "green",
"prior" = "orange"),
labels = c("likelihood" = "Likelihood",
"posterior" = "Posterior",
"prior" = "Prior")) +
annotate("text", x = eap_result$theta_eap + 0.5, y = max(viz_data$posterior) * 0.8,
label = "EAP", color = "red") +
annotate("text", x = eap_result$theta_map + 0.5, y = max(viz_data$posterior) * 0.6,
label = "MAP", color = "darkred")
# Credible interval highlight
ci_data <- viz_data[viz_data$theta >= eap_result$ci_lower &
viz_data$theta <= eap_result$ci_upper, ]
p2 <- ggplot(viz_data, aes(x = theta, y = posterior)) +
geom_line(size = 1.2, color = "blue") +
geom_ribbon(data = ci_data, aes(ymin = 0, ymax = posterior),
alpha = 0.5, fill = "lightblue") +
geom_vline(xintercept = c(eap_result$ci_lower, eap_result$ci_upper),
linetype = "dashed", color = "blue", alpha = 0.7) +
geom_vline(xintercept = eap_result$theta_eap, color = "red", size = 1) +
labs(title = "95% Credible Interval",
subtitle = paste("CI: [", round(eap_result$ci_lower, 3), ", ",
round(eap_result$ci_upper, 3), "]"),
x = "Qabiliyyət (θ)", y = "Posterior Sıxlığı") +
theme_minimal()
grid.arrange(p1, p2, ncol = 1)
return(list(plot1 = p1, plot2 = p2))
}
# Posterior vizuallaşdırması
if(!require(tidyr, quietly = TRUE)) {
# tidyr yoxdursa, manual reshape
viz_data <- data.frame(
theta = ability_est$theta_points,
posterior = ability_est$posterior,
likelihood = ability_est$likelihood / max(ability_est$likelihood),
prior = ability_est$prior / max(ability_est$prior)
)
p1 <- ggplot(viz_data, aes(x = theta)) +
geom_line(aes(y = posterior, color = "Posterior"), size = 1.2) +
geom_line(aes(y = likelihood, color = "Likelihood"), size = 1.2) +
geom_line(aes(y = prior, color = "Prior"), size = 1.2) +
geom_area(aes(y = posterior), alpha = 0.3, fill = "blue") +
geom_vline(xintercept = ability_est$theta_eap, linetype = "dashed", color = "red") +
labs(title = "EAP Posterior Paylanması",
x = "Qabiliyyət (θ)", y = "Normallaşdırılmış Sıxlıq") +
theme_minimal() +
scale_color_manual(values = c("Posterior" = "blue", "Likelihood" = "green", "Prior" = "orange"))
print(p1)
} else {
posterior_plots <- visualize_eap_posterior(ability_est, "(3 tapşırıq)")
}
# MLE qiymətləndirmə funksiyası (müqayisə üçün)
estimate_ability_mle <- function(item_indices, responses, item_bank, max_iter = 20) {
if(length(responses) == 0) return(list(theta = 0, se = 1, converged = FALSE))
# Əgər bütün cavablar 0 və ya 1-dirsə
if(all(responses == 0)) return(list(theta = -3, se = 1, converged = FALSE))
if(all(responses == 1)) return(list(theta = 3, se = 1, converged = FALSE))
theta <- 0 # Başlanğıc dəyər
for(iter in 1:max_iter) {
first_deriv <- 0
second_deriv <- 0
information <- 0
for(i in 1:length(item_indices)) {
item_idx <- item_indices[i]
response <- responses[i]
a <- item_bank$a[item_idx]
b <- item_bank$b[item_idx]
c <- item_bank$c[item_idx]
P <- c + (1 - c) * plogis(a * (theta - b))
P <- pmax(1e-6, pmin(1 - 1e-6, P)) # Stability
Q <- 1 - P
# First və second derivatives
P_star <- (P - c) / (1 - c)
first_deriv <- first_deriv + a * (response - P) / (P * Q) * (P - c)
# Information (negative second derivative)
info_item <- a^2 * (P - c)^2 * Q / ((1 - c)^2 * P)
information <- information + info_item
}
if(information > 0) {
theta_new <- theta + first_deriv / information
if(abs(theta_new - theta) < 0.001) break
theta <- pmax(-4, pmin(4, theta_new))
} else {
break
}
}
se <- ifelse(information > 0, 1/sqrt(information), 1)
return(list(
theta = theta,
se = se,
information = information,
converged = iter < max_iter
))
}
# EAP vs MLE müqayisəsi funksiyası
compare_eap_mle <- function(item_bank, n_simulations = 100, true_theta_range = c(-2, 2)) {
cat("=== EAP vs MLE MÜQAYİSƏ SİMULYASİYASI ===\n")
cat("Simulyasiya sayı:", n_simulations, "\n")
cat("Həqiqi θ aralığı:", true_theta_range, "\n\n")
set.seed(12345)
# Müxtəlif test uzunluqları
test_lengths <- c(3, 5, 10, 15)
comparison_results <- data.frame()
for(test_length in test_lengths) {
cat("Test uzunluğu:", test_length, "tapşırıq\n")
eap_errors <- numeric(n_simulations)
mle_errors <- numeric(n_simulations)
eap_ses <- numeric(n_simulations)
mle_ses <- numeric(n_simulations)
mle_convergence <- numeric(n_simulations)
for(sim in 1:n_simulations) {
# Təsadüfi həqiqi θ
true_theta <- runif(1, true_theta_range[1], true_theta_range[2])
# Təsadüfi item seç
selected_items <- sample(1:nrow(item_bank), test_length)
# Cavabları simulyasiya et
responses <- numeric(test_length)
for(i in 1:test_length) {
item_idx <- selected_items[i]
a <- item_bank$a[item_idx]
b <- item_bank$b[item_idx]
c <- item_bank$c[item_idx]
prob <- c + (1 - c) * plogis(a * (true_theta - b))
responses[i] <- rbinom(1, 1, prob)
}
# EAP qiymətləndirmə
eap_result <- estimate_ability_eap(selected_items, responses, item_bank)
eap_errors[sim] <- abs(eap_result$theta_eap - true_theta)
eap_ses[sim] <- eap_result$se_eap
# MLE qiymətləndirmə
mle_result <- estimate_ability_mle(selected_items, responses, item_bank)
mle_errors[sim] <- abs(mle_result$theta - true_theta)
mle_ses[sim] <- mle_result$se
mle_convergence[sim] <- as.numeric(mle_result$converged)
}
# Nəticələri topla
temp_results <- data.frame(
Test_Length = test_length,
Method = rep(c("EAP", "MLE"), each = n_simulations),
Error = c(eap_errors, mle_errors),
SE = c(eap_ses, mle_ses),
Converged = c(rep(1, n_simulations), mle_convergence)
)
comparison_results <- rbind(comparison_results, temp_results)
# Statistikalar
cat(" EAP orta xəta:", round(mean(eap_errors), 4),
"| EAP orta SE:", round(mean(eap_ses), 4), "\n")
cat(" MLE orta xəta:", round(mean(mle_errors), 4),
"| MLE orta SE:", round(mean(mle_ses), 4),
"| MLE konvergensiya:", round(mean(mle_convergence) * 100, 1), "%\n\n")
}
return(comparison_results)
}
# EAP vs MLE müqayisəsi
comparison_data <- compare_eap_mle(item_bank, n_simulations = 50)
## === EAP vs MLE MÜQAYİSƏ SİMULYASİYASI ===
## Simulyasiya sayı: 50
## Həqiqi θ aralığı: -2 2
##
## Test uzunluğu: 3 tapşırıq
## EAP orta xəta: 0.7133 | EAP orta SE: 0.8261
## MLE orta xəta: 2.7714 | MLE orta SE: 22.6532 | MLE konvergensiya: 4 %
##
## Test uzunluğu: 5 tapşırıq
## EAP orta xəta: 0.6138 | EAP orta SE: 0.7602
## MLE orta xəta: 3.0887 | MLE orta SE: 6.2638 | MLE konvergensiya: 4 %
##
## Test uzunluğu: 10 tapşırıq
## EAP orta xəta: 0.5059 | EAP orta SE: 0.6219
## MLE orta xəta: 3.5878 | MLE orta SE: 2.6076 | MLE konvergensiya: 2 %
##
## Test uzunluğu: 15 tapşırıq
## EAP orta xəta: 0.4023 | EAP orta SE: 0.532
## MLE orta xəta: 4.0373 | MLE orta SE: 2.0266 | MLE konvergensiya: 0 %
# EAP vs MLE müqayisə vizuallaşdırması
visualize_eap_mle_comparison <- function(comparison_data) {
# Xəta müqayisəsi
p1 <- ggplot(comparison_data, aes(x = factor(Test_Length), y = Error, fill = Method)) +
geom_boxplot() +
labs(title = "EAP vs MLE: Qiymətləndirmə Xətası Müqayisəsi",
x = "Test Uzunluğu", y = "Mütləq Xəta |θ̂ - θ|",
fill = "Metod") +
theme_minimal() +
scale_fill_manual(values = c("EAP" = "lightblue", "MLE" = "lightcoral"))
# SE müqayisəsi
p2 <- ggplot(comparison_data, aes(x = factor(Test_Length), y = SE, fill = Method)) +
geom_boxplot() +
labs(title = "EAP vs MLE: Standart Xəta Müqayisəsi",
x = "Test Uzunluğu", y = "Standart Xəta",
fill = "Metod") +
theme_minimal() +
scale_fill_manual(values = c("EAP" = "lightblue", "MLE" = "lightcoral"))
# Ortalama xəta trends
summary_data <- comparison_data %>%
group_by(Test_Length, Method) %>%
summarise(
Mean_Error = mean(Error),
Mean_SE = mean(SE),
Convergence_Rate = mean(Converged) * 100,
.groups = 'drop'
)
p3 <- ggplot(summary_data, aes(x = Test_Length, y = Mean_Error, color = Method)) +
geom_line(size = 1.2) +
geom_point(size = 3) +
labs(title = "Ortalama Xəta Trendi",
x = "Test Uzunluğu", y = "Ortalama Mütləq Xəta",
color = "Metod") +
theme_minimal() +
scale_color_manual(values = c("EAP" = "blue", "MLE" = "red"))
# Konvergensiya nisbəti
convergence_data <- summary_data %>% filter(Method == "MLE")
p4 <- ggplot(convergence_data, aes(x = Test_Length, y = Convergence_Rate)) +
geom_line(size = 1.2, color = "red") +
geom_point(size = 3, color = "red") +
labs(title = "MLE Konvergensiya Nisbəti",
x = "Test Uzunluğu", y = "Konvergensiya Faizi (%)") +
theme_minimal() +
ylim(0, 100)
grid.arrange(p1, p2, p3, p4, ncol = 2)
# Summary cədvəl
cat("\n=== PERFORMANS XÜLASƏSİ ===\n")
print(summary_data)
return(summary_data)
}
# Müqayisə vizuallaşdırması
performance_summary <- visualize_eap_mle_comparison(comparison_data)
##
## === PERFORMANS XÜLASƏSİ ===
## # A tibble: 8 × 5
## Test_Length Method Mean_Error Mean_SE Convergence_Rate
## <dbl> <chr> <dbl> <dbl> <dbl>
## 1 3 EAP 0.713 0.826 100
## 2 3 MLE 2.77 22.7 4
## 3 5 EAP 0.614 0.760 100
## 4 5 MLE 3.09 6.26 4
## 5 10 EAP 0.506 0.622 100
## 6 10 MLE 3.59 2.61 2
## 7 15 EAP 0.402 0.532 100
## 8 15 MLE 4.04 2.03 0
# Prior paylanmasının EAP-a təsirinin təhlili
analyze_prior_effects <- function(item_indices, responses, item_bank) {
cat("=== PRIOR PAYLANMASININ TƏSİRİ ===\n\n")
# Müxtəlif prior parametrləri
prior_configs <- list(
list(mean = 0, sd = 1, label = "Standard (0, 1)"),
list(mean = 0, sd = 0.5, label = "Dar (0, 0.5)"),
list(mean = 0, sd = 2, label = "Geniş (0, 2)"),
list(mean = 1, sd = 1, label = "Yüksək orta (1, 1)"),
list(mean = -1, sd = 1, label = "Aşağı orta (-1, 1)")
)
prior_results <- data.frame()
for(i in 1:length(prior_configs)) {
config <- prior_configs[[i]]
# EAP qiymətləndirmə
eap_result <- estimate_ability_eap(
item_indices, responses, item_bank,
prior_mean = config$mean, prior_sd = config$sd
)
# Nəticələri saxla
temp_result <- data.frame(
Prior_Config = config$label,
Prior_Mean = config$mean,
Prior_SD = config$sd,
EAP_Estimate = eap_result$theta_eap,
EAP_SE = eap_result$se_eap,
CI_Lower = eap_result$ci_lower,
CI_Upper = eap_result$ci_upper
)
prior_results <- rbind(prior_results, temp_result)
cat("Prior:", config$label, "\n")
cat(" EAP θ:", round(eap_result$theta_eap, 3), "\n")
cat(" SE:", round(eap_result$se_eap, 3), "\n")
cat(" 95% CI: [", round(eap_result$ci_lower, 3), ", ",
round(eap_result$ci_upper, 3), "]\n\n")
}
return(prior_results)
}
# Prior təsiri təhlili
prior_effects <- analyze_prior_effects(sample_items, sample_responses, item_bank)
## === PRIOR PAYLANMASININ TƏSİRİ ===
##
## Prior: Standard (0, 1)
## EAP θ: -0.109
## SE: 0.904
## 95% CI: [ -2 , 1.6 ]
##
## Prior: Dar (0, 0.5)
## EAP θ: -0.001
## SE: 0.478
## 95% CI: [ -1 , 0.9 ]
##
## Prior: Geniş (0, 2)
## EAP θ: -0.511
## SE: 1.482
## 95% CI: [ -3.5 , 2.2 ]
##
## Prior: Yüksək orta (1, 1)
## EAP θ: 0.646
## SE: 0.846
## 95% CI: [ -1.1 , 2.3 ]
##
## Prior: Aşağı orta (-1, 1)
## EAP θ: -1.007
## SE: 0.983
## 95% CI: [ -3 , 0.8 ]
# Prior təsiri vizuallaşdırması
visualize_prior_effects <- function(prior_results) {
# EAP qiymətləndirmələri
p1 <- ggplot(prior_results, aes(x = reorder(Prior_Config, EAP_Estimate), y = EAP_Estimate)) +
geom_point(size = 3, color = "blue") +
geom_errorbar(aes(ymin = CI_Lower, ymax = CI_Upper), width = 0.2) +
coord_flip() +
labs(title = "Prior Paylanmasının EAP Qiymətləndirməsinə Təsiri",
x = "Prior Konfiqurasiyası", y = "EAP Qiymətləndirmə") +
theme_minimal()
# SE müqayisəsi
p2 <- ggplot(prior_results, aes(x = reorder(Prior_Config, EAP_SE), y = EAP_SE)) +
geom_col(fill = "lightcoral", alpha = 0.7) +
coord_flip() +
labs(title = "Prior Paylanmasının SE-yə Təsiri",
x = "Prior Konfiqurasiyası", y = "Standart Xəta") +
theme_minimal()
grid.arrange(p1, p2, ncol = 1)
}
visualize_prior_effects(prior_effects)
# Informative vs Non-informative prior müqayisəsi
compare_prior_strategies <- function(item_bank, n_scenarios = 20) {
cat("=== INFORMATIVE vs NON-INFORMATIVE PRIOR MÜQAYİSƏSİ ===\n\n")
set.seed(789)
comparison_results <- data.frame()
# Müxtəlif ssenari növləri
scenarios <- data.frame(
true_theta = c(rep(-1.5, 5), rep(-0.5, 5), rep(0.5, 5), rep(1.5, 5)),
test_length = rep(c(3, 5, 8, 10, 15), 4)
)
for(i in 1:nrow(scenarios)) {
true_theta <- scenarios$true_theta[i]
test_length <- scenarios$test_length[i]
# Təsadüfi tapşırıqlar seç
selected_items <- sample(1:nrow(item_bank), test_length)
# Cavabları simulyasiya et
responses <- numeric(test_length)
for(j in 1:test_length) {
item_idx <- selected_items[j]
a <- item_bank$a[item_idx]
b <- item_bank$b[item_idx]
c <- item_bank$c[item_idx]
prob <- c + (1 - c) * plogis(a * (true_theta - b))
responses[j] <- rbinom(1, 1, prob)
}
# Müxtəlif prior strategiyaları
prior_strategies <- list(
list(mean = 0, sd = 1, type = "Non-informative", label = "Standard N(0,1)"),
list(mean = 0, sd = 2, type = "Non-informative", label = "Vague N(0,4)"),
list(mean = true_theta, sd = 0.5, type = "Informative", label = "Doğru informative"),
list(mean = true_theta + 0.5, sd = 0.3, type = "Mis-informative", label = "Yanlış informative")
)
for(strategy in prior_strategies) {
eap_result <- estimate_ability_eap(
selected_items, responses, item_bank,
prior_mean = strategy$mean, prior_sd = strategy$sd
)
temp_result <- data.frame(
Scenario = i,
True_Theta = true_theta,
Test_Length = test_length,
Prior_Type = strategy$type,
Prior_Label = strategy$label,
Prior_Mean = strategy$mean,
Prior_SD = strategy$sd,
EAP_Estimate = eap_result$theta_eap,
EAP_SE = eap_result$se_eap,
Absolute_Error = abs(eap_result$theta_eap - true_theta),
Bias = eap_result$theta_eap - true_theta
)
comparison_results <- rbind(comparison_results, temp_result)
}
if(i %% 5 == 0) cat("Ssenari", i, "/", nrow(scenarios), "tamamlandı\n")
}
return(comparison_results)
}