install.packages(“equate”)
library(equate)

set.seed(123)

Simulate scores for Test Form X and Y

scores_y <- round(rnorm(1000, mean = 75, sd = 12)) scores_x <- round(rnorm(1000, mean = 70, sd = 10))

Set score range

scores_y <- scores_y[scores_y >= 0 & scores_y <= 100] scores_x <- scores_x[scores_x >= 0 & scores_x <= 100]

freq_y <- table(factor(scores_y, levels = 0:100)) freq_x <- table(factor(scores_x, levels = 0:100))


df_freq <- data.frame(Score = 0:100, Freq_Y = as.numeric(freq_y), Freq_X = as.numeric(freq_x))

#Plot Score Distribution of Test X and Test Y
#Mean equated score = x + (μY − μX)
# Mean for Test X and Test Y mean_y <- sum(df_freq\(Score * df_freq\)Freq_Y) / sum(df_freq$Freq_Y)
mean_x <- sum(df_freq\(Score * df_freq\)Freq_X) / sum(df_freq$Freq_X)
# Mean difference between Test X and Test Y
mean_diff <- mean_y - mean_x
print(mean_y) print(mean_x) print(mean_diff)
#Equate and add mean equated scores to data.frame
df_freq\(Mean_Equated_Score <- df_freq\)Score + mean_diff
#Compare Equated scores to Y scores
mean_y <- sum(df_freq\(Score * df_freq\)Freq_Y) / sum(df_freq\(Freq_Y) mean_equated <- sum(df_freq\)Mean_Equated_Score * df_freq\(Freq_X) / sum(df_freq\)Freq_X)
print(mean_y) print(mean_equated)

#Original score distribution plot

plot(df_freq\(Score, df_freq\)Freq_X, type = “l”, col = “blue”, lwd = 2, ylim = range(c(df_freq\(Freq_X, df_freq\)Freq_Y)), xlab = “Score”, ylab = “Frequency”, main = “Distributions of Test X and Y”) lines(df_freq\(Score, df_freq\)Freq_Y, col = “red”, lwd = 2) legend(“topright”, legend = c(“Test X”, “Test Y”), col = c(“blue”, “red”), lwd = 2)

Mean Equating Plot
plot(df_freq\(Score, df_freq\)Mean_Equated_Score, type = “l”, lwd = 2, col = “darkgreen”, xlab = “Original Score on Test X”, ylab = “Mean-Equated Score on Test Y”, main = “Mean Equating Function: Test X to Test Y”)
abline(0, 1, col = “gray”, lty = 2) # Identity line for reference legend(“topleft”, legend = c(“Mean-Equated Scores”, “Identity Line”), col = c(“darkgreen”, “gray”), lwd = 2, lty = c(1, 2))

#Linear Equating # Linear_Equated_Score = (SDX/SDY) * (Score x − μX) + μY)

mean_x <- sum(df_freq\(Score * df_freq\)Freq_X) / sum(df_freq\(Freq_X) mean_y <- sum(df_freq\)Score * df_freq\(Freq_Y) / sum(df_freq\)Freq_Y)

Variance for X

var_x <- sum(df_freq\(Freq_X * (df_freq\)Score - mean_x)^2) / sum(df_freq$Freq_X) sd_x <- sqrt(var_x)

Variance for Y

var_y <- sum(df_freq\(Freq_Y * (df_freq\)Score - mean_y)^2) / sum(df_freq$Freq_Y) sd_y <- sqrt(var_y)

#Apply Linear Equating Formula

df_freq\(Linear_Equated_Score <- ((df_freq\)Score - mean_x) * (sd_y / sd_x)) + mean_y

#Plot Linear Equated Results with X scores plot(df_freq\(Score, df_freq\)Linear_Equated_Score, type = “l”, col = “blue”, lwd = 2, xlab = “Score on Test X”, ylab = “Linear-Equated Score on Test Y”, main = “Linear Equating Function”) abline(0, 1, col = “gray”, lty = 2) # identity line legend(“topleft”, legend = c(“Linear Equating”, “Identity Line”), col = c(“blue”, “gray”), lwd = 2, lty = c(1, 2))

#Plotting both Mean and Linear Equated Results # Plot the original Score vs Mean Equated Score plot(df_freq\(Score, df_freq\)Mean_Equated_Score, type = “l”, col = “darkgreen”, lwd = 2, xlab = “Original Score on Test X”, ylab = “Equated Score on Test Y”, main = “Mean vs Linear Equating”)
# Equipercentile Equating
# Create frequency tables for X and Y ft_x <- as.freqtab(table(factor(df_freq\(Score, levels = 0:100), df_freq\)Freq_X)) ft_y <- as.freqtab(table(factor(df_freq\(Score, levels = 0:100), df_freq\)Freq_Y))
# Run Equiperncentile Equating eq_equip <- equate(ft_x, ft_y, type = “equipercentile”, smooth = “none”)
equating_table <- data.frame( Score = eq_equip\(concordance\)scale, Equipercentile_Equated_Score = eq_equip\(concordance\)yx )
df_freq <- merge(df_freq, equating_table, by = “Score”, all.x = TRUE)

Base plot with identity line

plot(df_freq\(Score, df_freq\)Score, type = “l”, col = “gray”, lwd = 2, lty = 2, xlab = “Raw Score on Test X”, ylab = “Equated Score on Test Y”, main = “Comparison of Equating Methods”, ylim = range(c(df_freq\(Linear_Equated_Score, df_freq\)Mean_Equated_Score, df_freq$Equipercentile_Equated_Score)))

Add Mean Equating

lines(df_freq\(Score, df_freq\)Mean_Equated_Score, col = “darkgreen”, lwd = 2)

Add Linear Equating

lines(df_freq\(Score, df_freq\)Linear_Equated_Score, col = “blue”, lwd = 2)

Add Equipercentile Equating

lines(df_freq\(Score, df_freq\)Equipercentile_Equated_Score, col = “red”, lwd = 2)

Add Legend

legend(“topleft”, legend = c(“Identity Line”, “Mean Equating”, “Linear Equating”, “Equipercentile Equating”), col = c(“gray”, “darkgreen”, “blue”, “red”), lty = c(2, 1, 1, 1), lwd = 2)

plot(df_freq\(Score, df_freq\)Score, type = “l”, lwd = 2, col = “black”, xlab = “Observed Score (Form X)”, ylab = “Equated Score (Form Y)”, main = “Equated Scores by Method”, ylim = range(c(df_freq\(Score, df_freq\)Mean_Equated_Score, df_freq\(Linear_Equated_Score, df_freq\)Equipercentile_Equated_Score), na.rm = TRUE))
# Add identity line using abline() abline(a = 0, b = 1, col = “black”, lwd = 2, lty = 1) # identity line y = x
# Add equated scores lines(df_freq\(Score, df_freq\)Mean_Equated_Score, col = “blue”, lty = 2, lwd = 2) lines(df_freq\(Score, df_freq\)Linear_Equated_Score, col = “red”, lty = 3, lwd = 2) lines(df_freq\(Score, df_freq\)Equipercentile_Equated_Score, col = “green”, lty = 4, lwd = 2)
# Legend legend(“topleft”, legend = c(“Original (Identity)”, “Mean Equated”, “Linear Equated”, “Equipercentile Equated”), col = c(“black”, “blue”, “red”, “green”), lty = c(1, 2, 3, 4), lwd = 2)
summary(df_freq[, c("Score", 
                    "Mean_Equated_Score", 
                    "Linear_Equated_Score", 
                    "Equipercentile_Equated_Score")])