if (is.null(dif.items)) { tam1 <- TAM::tam.mml(resp=resp,Y=grp,irtmodel = model,est.variance = T,verbose=F) } else { nodif.items <- setdiff(items,dif.items) nodif.items.list <- paste0("item",nodif.items) dif.items.list <- c(paste0("item",dif.items,"_noTT"),paste0("item",dif.items,"_TT")) if (!is.null(dif.items)) { if (length(nodif.items)!=0) { resp <- df[,c(nodif.items.list,dif.items.list)] } else { resp <- df[,c(dif.items.list)] } } else { resp <- df[,c(nodif.items.list)] } tam1 <- TAM::tam.mml(resp=resp,Y=grp,irtmodel = model,est.variance = T,verbose=F) } } return(summary(tam1)) } rosali <- function(dat=NULL,items=NULL,group=NULL) { nbitems <- length(items) items2 <- items # Un seul groupe if (length(group)!=1) { stop('Only one variable can be used for the group option') } # Recoder groupe en 0/1 dat[,group] <- as.factor(dat[,group]) if (!(all(names(levels(dat[,group]))==c("0","1")))) { levels(dat[,group]) <- c("0","1") } dat[,group] <- as.numeric(dat[,group])-1 model_a <- pcm(df=dat,items=items,group = group,dif.items = items) model_b <- pcm(df=dat,items=items,group = group,dif.items = NULL) return(c(model_a)) } rosali(dat=dat,items=1:7,group="TT") rosali <- function(dat=NULL,items=NULL,group=NULL) { nbitems <- length(items) items2 <- items # Un seul groupe if (length(group)!=1) { stop('Only one variable can be used for the group option') } # Recoder groupe en 0/1 dat[,group] <- as.factor(dat[,group]) if (!(all(names(levels(dat[,group]))==c("0","1")))) { levels(dat[,group]) <- c("0","1") } dat[,group] <- as.numeric(dat[,group])-1 model_a <- pcm(df=dat,items=items,group = group,dif.items = items) model_b <- pcm(df=dat,items=items,group = group,dif.items = NULL) return(c(model_b)) } rosali(dat=dat,items=1:7,group="TT") rosali <- function(dat=NULL,items=NULL,group=NULL) { nbitems <- length(items) items2 <- items # Un seul groupe if (length(group)!=1) { stop('Only one variable can be used for the group option') } # Recoder groupe en 0/1 dat[,group] <- as.factor(dat[,group]) if (!(all(names(levels(dat[,group]))==c("0","1")))) { levels(dat[,group]) <- c("0","1") } dat[,group] <- as.numeric(dat[,group])-1 model_a <- pcm(df=dat,items=items,group = group,dif.items = items) model_b <- pcm(df=dat,items=items,group = group,dif.items = NULL) } rosali(dat=dat,items=1:7,group="TT") model_b <- pcm(df=dat,items=1:7,group = "TT",dif.items = 1:7) model_a <- pcm(df=dat,items=1:7,group = "TT",dif.items = NULL) lrt lrt'' ??lrt loglik(model_a) logLik(model_a) ## File Name: pcm.R ## File version: 1.0 #' @import TAM #' @export pcm <- function(df=NULL,items=NULL,group=NULL,model="PCM2",method="MML",dif.items=NULL) { # Prepare analysis if (is.null(items)) { nbitems <- sum(sapply(1:100,function(x) paste0('item',x)) %in% colnames(df)) items <- paste0('item',seq(1,nbitems)) resp <- df[,items] } else { nbitems <- length(items) resp <- df[,paste0("item",items)] } if (is.null(group)) { grp <- NULL } else { grp <- df[,group] df$grp <- grp if (!is.null(dif.items)) { for (i in dif.items) { df[,paste0('item',i,'_noTT')] <- NA df[,paste0('item',i,'_TT')] <- NA df[df$grp==0,paste0('item',i,'_noTT')] <- df[df$grp==0,paste0('item',i)] df[df$grp==1,paste0('item',i,'_TT')] <- df[df$grp==1,paste0('item',i)] } } } # Analyze if (method=='MML') { if (is.null(dif.items)) { tam1 <- TAM::tam.mml(resp=resp,Y=grp,irtmodel = model,est.variance = T,verbose=F) } else { nodif.items <- setdiff(items,dif.items) nodif.items.list <- paste0("item",nodif.items) dif.items.list <- c(paste0("item",dif.items,"_noTT"),paste0("item",dif.items,"_TT")) if (!is.null(dif.items)) { if (length(nodif.items)!=0) { resp <- df[,c(nodif.items.list,dif.items.list)] } else { resp <- df[,c(dif.items.list)] } } else { resp <- df[,c(nodif.items.list)] } tam1 <- TAM::tam.mml(resp=resp,Y=grp,irtmodel = model,est.variance = T,verbose=F) } } return(tam1) } rosali <- function(dat=NULL,items=NULL,group=NULL) { nbitems <- length(items) items2 <- items # Un seul groupe if (length(group)!=1) { stop('Only one variable can be used for the group option') } # Recoder groupe en 0/1 dat[,group] <- as.factor(dat[,group]) if (!(all(names(levels(dat[,group]))==c("0","1")))) { levels(dat[,group]) <- c("0","1") } dat[,group] <- as.numeric(dat[,group])-1 model_a <- pcm(df=dat,items=items,group = group,dif.items = items) model_b <- pcm(df=dat,items=items,group = group,dif.items = NULL) } model_b <- pcm(df=dat,items=1:7,group = "TT",dif.items = 1:7) model_a <- pcm(df=dat,items=1:7,group = "TT",dif.items = NULL) logLik(model_a) logLik(model_b) library(lmtest) lrtest(model_a,model_b) lrtest(model_a,model_b)$p ss <- lrtest(model_a,model_b) ss$`Pr(>Chisq)` ss$`Pr(>Chisq)`[2] a <- c() a c(a,1) which(1:4,3) ?which which.min(1:4) which.min(2:4) rosali <- function(dat=NULL,items=NULL,group=NULL) { nbitems <- length(items) items2 <- items # Un seul groupe if (length(group)!=1) { stop('Only one variable can be used for the group option') } # Recoder groupe en 0/1 dat[,group] <- as.factor(dat[,group]) if (!(all(names(levels(dat[,group]))==c("0","1")))) { levels(dat[,group]) <- c("0","1") } dat[,group] <- as.numeric(dat[,group])-1 model_a <- pcm(df=dat,items=items,group = group,dif.items = items) model_b <- pcm(df=dat,items=items,group = group,dif.items = NULL) ltest <- lmtest::lrtest(model_a,model_b) if (ltest$`Pr(>Chisq)`[2]<1) { model_c <- model_b difit <- c() a <- sapply(1:nbitems,function(x) lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2]) while (min(a)<0.4) { difit <- c(difit,which.min(a)) model_c <- pcm(df=dat,items=items,group = group,dif.items = difit) a <- sapply(1:nbitems,function(x) lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2]) } } } rosali(dat=dat,items=1:7,group="TT") rosali <- function(dat=NULL,items=NULL,group=NULL) { nbitems <- length(items) items2 <- items # Un seul groupe if (length(group)!=1) { stop('Only one variable can be used for the group option') } # Recoder groupe en 0/1 dat[,group] <- as.factor(dat[,group]) if (!(all(names(levels(dat[,group]))==c("0","1")))) { levels(dat[,group]) <- c("0","1") } dat[,group] <- as.numeric(dat[,group])-1 model_a <- pcm(df=dat,items=items,group = group,dif.items = items) model_b <- pcm(df=dat,items=items,group = group,dif.items = NULL) ltest <- lmtest::lrtest(model_a,model_b) if (ltest$`Pr(>Chisq)`[2]<1) { model_c <- model_b difit <- c() a <- sapply(1:nbitems,function(x) lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2]) while (min(a)<0.4) { difit <- c(difit,which.min(a)) model_c <- pcm(df=dat,items=items,group = group,dif.items = difit) print(difit) a <- sapply(1:nbitems,function(x) lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2]) } } } rosali(dat=dat,items=1:7,group="TT") rosali <- function(dat=NULL,items=NULL,group=NULL) { nbitems <- length(items) items2 <- items # Un seul groupe if (length(group)!=1) { stop('Only one variable can be used for the group option') } # Recoder groupe en 0/1 dat[,group] <- as.factor(dat[,group]) if (!(all(names(levels(dat[,group]))==c("0","1")))) { levels(dat[,group]) <- c("0","1") } dat[,group] <- as.numeric(dat[,group])-1 model_a <- pcm(df=dat,items=items,group = group,dif.items = items) model_b <- pcm(df=dat,items=items,group = group,dif.items = NULL) ltest <- lmtest::lrtest(model_a,model_b) if (ltest$`Pr(>Chisq)`[2]<1) { model_c <- model_b difit <- c() a <- sapply(1:nbitems,function(x) lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2]) while (min(a)<0.4) { difit <- c(difit,which.min(a)) model_c <- pcm(df=dat,items=items,group = group,dif.items = difit) print(difit) a <- sapply(1:nbitems,function(x) lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2]) print(a) } } } rosali(dat=dat,items=1:7,group="TT") rosali <- function(dat=NULL,items=NULL,group=NULL) { nbitems <- length(items) items2 <- items # Un seul groupe if (length(group)!=1) { stop('Only one variable can be used for the group option') } # Recoder groupe en 0/1 dat[,group] <- as.factor(dat[,group]) if (!(all(names(levels(dat[,group]))==c("0","1")))) { levels(dat[,group]) <- c("0","1") } dat[,group] <- as.numeric(dat[,group])-1 model_a <- pcm(df=dat,items=items,group = group,dif.items = items) model_b <- pcm(df=dat,items=items,group = group,dif.items = NULL) ltest <- lmtest::lrtest(model_a,model_b) if (ltest$`Pr(>Chisq)`[2]<1) { model_c <- model_b difit <- c() a <- sapply(1:nbitems,function(x) lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2]) while (min(a)<0.4) { difit <- c(difit,which.min(a)) model_c <- pcm(df=dat,items=items,group = group,dif.items = difit) print(difit) a <- sapply(1:nbitems,function(x) ifelse(x%in%difit,lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2],1)) print(a) } } } rosali(dat=dat,items=1:7,group="TT") rosali <- function(dat=NULL,items=NULL,group=NULL) { nbitems <- length(items) items2 <- items # Un seul groupe if (length(group)!=1) { stop('Only one variable can be used for the group option') } # Recoder groupe en 0/1 dat[,group] <- as.factor(dat[,group]) if (!(all(names(levels(dat[,group]))==c("0","1")))) { levels(dat[,group]) <- c("0","1") } dat[,group] <- as.numeric(dat[,group])-1 model_a <- pcm(df=dat,items=items,group = group,dif.items = items) model_b <- pcm(df=dat,items=items,group = group,dif.items = NULL) ltest <- lmtest::lrtest(model_a,model_b) if (ltest$`Pr(>Chisq)`[2]<1) { model_c <- model_b difit <- c() a <- sapply(1:nbitems,function(x) lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2]) while (min(a)<0.4) { difit <- c(difit,which.min(a)) model_c <- pcm(df=dat,items=items,group = group,dif.items = difit) print(difit) a <- sapply(1:nbitems,function(x) ifelse(!(x%in%difit),lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2],1)) print(a) } } } rosali(dat=dat,items=1:7,group="TT") rosali <- function(dat=NULL,items=NULL,group=NULL) { nbitems <- length(items) items2 <- items # Un seul groupe if (length(group)!=1) { stop('Only one variable can be used for the group option') } # Recoder groupe en 0/1 dat[,group] <- as.factor(dat[,group]) if (!(all(names(levels(dat[,group]))==c("0","1")))) { levels(dat[,group]) <- c("0","1") } dat[,group] <- as.numeric(dat[,group])-1 model_a <- pcm(df=dat,items=items,group = group,dif.items = items) model_b <- pcm(df=dat,items=items,group = group,dif.items = NULL) ltest <- lmtest::lrtest(model_a,model_b) difit <- c() if (ltest$`Pr(>Chisq)`[2]<0.05) { model_c <- model_b a <- sapply(1:nbitems,function(x) lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2]) while (min(a)<0.05) { difit <- c(difit,which.min(a)) model_c <- pcm(df=dat,items=items,group = group,dif.items = difit) print(difit) a <- sapply(1:nbitems,function(x) ifelse(!(x%in%difit),lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2],1)) } } return(difit) } rosali(dat=dat,items=1:7,group="TT") dat <- read.csv("/home/corentin/Documents/These/Recherche/Simulations/Data/DIF/N200/scenario_20A_200.csv") dat <- dat[dat$replication==2,] rosali(dat=dat,items=1:7,group="TT") rosali <- function(dat=NULL,items=NULL,group=NULL) { nbitems <- length(items) items2 <- items # Un seul groupe if (length(group)!=1) { stop('Only one variable can be used for the group option') } # Recoder groupe en 0/1 dat[,group] <- as.factor(dat[,group]) if (!(all(names(levels(dat[,group]))==c("0","1")))) { levels(dat[,group]) <- c("0","1") } dat[,group] <- as.numeric(dat[,group])-1 model_a <- pcm(df=dat,items=items,group = group,dif.items = items) model_b <- pcm(df=dat,items=items,group = group,dif.items = NULL) ltest <- lmtest::lrtest(model_a,model_b) difit <- c() if (ltest$`Pr(>Chisq)`[2]<0.05) { model_c <- model_b a <- sapply(1:nbitems,function(x) lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2]) while (min(a)<0.05) { difit <- c(difit,which.min(a)) model_c <- pcm(df=dat,items=items,group = group,dif.items = difit) a <- sapply(1:nbitems,function(x) ifelse(!(x%in%difit),lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2],1)) } } return(difit) } rosali(dat=dat,items=1:7,group="TT") dat <- read.csv("/home/corentin/Documents/These/Recherche/Simulations/Data/DIF/N200/scenario_20A_200.csv") dat <- dat[dat$replication==3,] rosali(dat=dat,items=1:7,group="TT") rosali <- function(dat=NULL,items=NULL,group=NULL) { nbitems <- length(items) items2 <- items # Un seul groupe if (length(group)!=1) { stop('Only one variable can be used for the group option') } # Recoder groupe en 0/1 dat[,group] <- as.factor(dat[,group]) if (!(all(names(levels(dat[,group]))==c("0","1")))) { levels(dat[,group]) <- c("0","1") } dat[,group] <- as.numeric(dat[,group])-1 model_a <- pcm(df=dat,items=items,group = group,dif.items = items) model_b <- pcm(df=dat,items=items,group = group,dif.items = NULL) ltest <- lmtest::lrtest(model_a,model_b) difit <- c() if (ltest$`Pr(>Chisq)`[2]<0.05) { model_c <- model_b a <- sapply(1:nbitems,function(x) lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2]) k <- 0 while (min(a)<0.05/(nbitems-k)) { difit <- c(difit,which.min(a)) model_c <- pcm(df=dat,items=items,group = group,dif.items = difit) a <- sapply(1:nbitems,function(x) ifelse(!(x%in%difit),lmtest::lrtest(model_c,pcm(df=dat,items=items,group = group,dif.items = c(difit,x)))$`Pr(>Chisq)`[2],1)) } } return(difit) } rosali(dat=dat,items=1:7,group="TT") pcm(dat,items=1:7,group="TT",dif.items=1:2) summary(pcm(dat,items=1:7,group="TT",dif.items=1:2)) library(TAM) resali <- function(df=NULL,items=NULL,group=NULL,verbose=T) { if (verbose) { cat('-----------------------------------------------------------\n') cat('COMPUTING INITIAL PCM\n') cat('-----------------------------------------------------------\n') } nbitems <- length(items) nbitems_o <- nbitems items_n <- paste0('item',items) resp <- df[,items_n] grp <- df[,group] pcm_initial <- TAM::tam.mml(resp=resp,Y=grp,irtmodel = "PCM",est.variance = T,verbose=F) dat <- df dat$score <- rowSums(dat[,items_n]) dat$score_q5 <- cut(dat$score,quantile(dat$score,seq(0,1,0.2)),labels=1:5,include.lowest=T) res.anova <- rep(NA,nbitems) pval <- rep(NA,nbitems) fval <- rep(NA,nbitems) for (i in items) { dat[,paste0('res_',i)] <- rowMeans(predict(pcm_initial)$stand.resid[,,i]) res.anova[i] <- summary(aov(dat[,paste0('res_',i)]~TT*score_q5,data=dat)) pval[i] <- res.anova[[i]][1,"Pr(>F)"] fval[i] <- res.anova[[i]][1,'F value'] } if (verbose) { cat('DONE\n') cat('-----------------------------------------------------------\n') } res.items <- c() res.uniform <- c() k <- 1 while(any(pval<0.05/nbitems_o)) { k <- k+1 if (verbose) { cat(paste('COMPUTING STEP',k,'\n')) cat('-----------------------------------------------------------\n') } res.item <- gsub("[a-z]", "",colnames(resp)[which.max(fval)]) res.items <- c(res.items,res.item) res.uni <- res.anova[[which.max(fval)]][3,"Pr(>F)"]>0.05 res.uniform <- c(res.uniform,res.uni) items_n <- c(items_n[items_n!=paste0('item',res.item)],paste0("item",res.item,c("noTT","TT"))) dat[,paste0("item",res.item,'TT')] <- dat[dat$TT==1,paste0('item',res.item)] dat[,paste0("item",res.item,'noTT')] <- dat[dat$TT==0,paste0('item',res.item)] resp <- dat[,items_n] grp <- dat[,group] pcm_while <- TAM::tam.mml(resp=resp,Y=grp,irtmodel = "PCM",est.variance = T,verbose=F) nbitems <- length(items_n) res.anova <- rep(NA,nbitems) pval <- rep(NA,nbitems) fval <- rep(NA,nbitems) for (i in 1:nbitems) { dat[,paste0('res_',i)] <- rowMeans(predict(pcm_while)$stand.resid[,,i]) res.anova[i] <- summary(aov(dat[,paste0('res_',i)]~TT*score_q5,data=dat)) pval[i] <- res.anova[[i]][1,"Pr(>F)"] fval[i] <- res.anova[[i]][1,'F value'] } if (verbose) { cat('DONE\n') cat('-----------------------------------------------------------\n') } } if (verbose) { cat("DETECTED DIF ITEMS\n") cat('-----------------------------------------------------------\n') } if (length(res.items>0)) { results <- data.frame(dif.items=res.items, uniform=1*res.uniform) return(results) } else { cat("No DIF was detected") return(NULL) } } resali(df=dat,items=1:7,group="TT") dat$dif1 dat$dif2 dat$dif3