From 630ec09cf35f5a2a667050d45a677c25b3599f29 Mon Sep 17 00:00:00 2001 From: Kyle Hamilton Date: Mon, 24 Nov 2014 19:32:08 -0800 Subject: [PATCH] Files for CRAN --- DESCRIPTION | 19 + NAMESPACE | 10 + R/IRTShiny.R | 18 + inst/IRT/server.R | 922 ++++++++++++++++++++++++++++++++++++++++++++++ inst/IRT/ui.R | 328 +++++++++++++++++ man/startIRT.Rd | 27 ++ 6 files changed, 1324 insertions(+) create mode 100644 DESCRIPTION create mode 100644 NAMESPACE create mode 100644 R/IRTShiny.R create mode 100644 inst/IRT/server.R create mode 100644 inst/IRT/ui.R create mode 100644 man/startIRT.Rd diff --git a/DESCRIPTION b/DESCRIPTION new file mode 100644 index 0000000..5a73560 --- /dev/null +++ b/DESCRIPTION @@ -0,0 +1,19 @@ +Package: IRTShiny +Type: Package +Title: Item Responce Theory via Shiny +Version: 1.0 +Date: 2014-11-24 +Author: William Kyle Hamilton , Atsushi Mizumoto + +Maintainer: William Kyle Hamilton +Description: Interactive shiny application for running Item Response Theory + analysis. +License: GPL-3 +Imports: + shiny, + shinyAce, + beeswarm, + CTT, + ltm, + parallel, +LazyData: true diff --git a/NAMESPACE b/NAMESPACE new file mode 100644 index 0000000..b9826c3 --- /dev/null +++ b/NAMESPACE @@ -0,0 +1,10 @@ + +export(startIRT) + +import(shiny) +import(shinyAce) +import(beeswarm) +import(parallel) +import(CTT) +import(ltm) +importFrom(psych,describe) \ No newline at end of file diff --git a/R/IRTShiny.R b/R/IRTShiny.R new file mode 100644 index 0000000..7cb4d2e --- /dev/null +++ b/R/IRTShiny.R @@ -0,0 +1,18 @@ +#' Start IRTShiny +#' @title This function will start IRTShiny +#' @return Nothing +#' @description An interactive Shiny application for running a IRT analysis. +#' @details This starts the Shiny application IRT. +#' @keywords IRT +#' @examples +#' \dontrun{ +#' library(shiny) +#' startIRT() +#' } +#' @export + +startIRT <- function() { + + shiny::runApp(appDir = system.file("IRT", package="IRTShiny")) + +} diff --git a/inst/IRT/server.R b/inst/IRT/server.R new file mode 100644 index 0000000..0cc8972 --- /dev/null +++ b/inst/IRT/server.R @@ -0,0 +1,922 @@ +# library(shiny) +# library(shinyAce) +# library(psych) +# library(CTT) +# library(ltm) +# library(beeswarm) +# library(parallel) + +shinyServer(function(input, output) { + + + options(warn=-1) + + q <- observe({ + # Stop the app when the quit button is clicked + if (input$quit == 1) stopApp() + }) + +####################################################### +# Dichotomous Models +####################################################### + + bs <- reactive({ + + dat <- read.csv(text=input$text1, sep="\t") + + total <- rowSums(dat, na.rm=T) + result <- psych::describe(total)[2:13] + row.names(result) <- "Total " + result + + }) + + output$textarea.out <- renderPrint({ + bs() + }) + + + + + + alpha.result <- reactive({ + + dat <- read.csv(text=input$text1, sep="\t") + + brownRpbi <- function(data,missing) { + m <- mean(rowSums(data)) + sd <- sd(rowSums(data)) + totalDat <- cbind(data,rowSums(data)) + sortDat <- totalDat[order(-totalDat[,length(totalDat)]),] + r <- c() + itemD <- c() + rownames(sortDat) <- c(1:nrow(sortDat)) + highDat <- head(sortDat,nrow(sortDat) %/% 3) + lowDat <- tail(sortDat,nrow(sortDat) %/% 3) + for (i in 1:length(data)) { + if (is.element(colnames(data)[i], missing) == F ) { + mhigh <- mean(subset(totalDat[,length(totalDat)],(data[,i] == 1))) + mlow <- mean(subset(totalDat[,length(totalDat)],(data[,i] == 0))) + imean <- mean(data[,i]) + itemD <- c(itemD,round((mean(highDat[,i]) - mean(lowDat[,i])),3)) + rtemp <- round(cor(data[,i],totalDat[,ncol(totalDat)]),3) + r <- c(r,rtemp) + } + } + pbiDF <- data.frame(itemD, r) + colnames(pbiDF) <- c("ID", "r") + return(pbiDF) + } + + myAlpha <- function(data) { + alphaRes <- reliability(data, itemal = T) + if (length(alphaRes$N_person) == 0) { + n <- sprintf("%d",alphaRes$nPerson) + items <- sprintf("%d",alphaRes$nItem) + mean <- sprintf("%.2f",round(alphaRes$scaleMean,2)) + sd <- sprintf("%.2f",round(alphaRes$scaleSD,2)) + alpha <- substring(sprintf("%.3f",round(alphaRes$alpha,3)),2,5) + } else { + n <- sprintf("%d",alphaRes$N_person) + items <- sprintf("%d",alphaRes$N_item) + mean <- sprintf("%.2f",round(alphaRes$scale.mean,2)) + sd <- sprintf("%.2f",round(alphaRes$scale.sd,2)) + alpha <- substring(sprintf("%.3f",round(alphaRes$alpha,3)),2,5) + } + + sumStats <- data.frame(Total=c(n,items,alpha)) + rownames(sumStats) <- c("N","Number of items","Cronbach's alpha") + if (length(alphaRes$N_person) == 0) { + dropif <- round(ifelse(is.na(alphaRes$alphaIfDeleted),0,alphaRes$alphaIfDeleted),3) + r.drop <- round(ifelse(is.na(alphaRes$pBis), 0, alphaRes$pBis),3) + item.mean <- round(alphaRes$itemMean,3) + itemStats <- data.frame(dropif,r.drop,item.mean) + rownames(itemStats) <- colnames(data) + } else { + dropif <- round(ifelse(is.na(alphaRes$alpha.if.deleted),0,alphaRes$alpha.if.deleted),3) + r.drop <- round(ifelse(is.na(alphaRes$pbis), 0, alphaRes$pbis),3) + item.mean <- round(alphaRes$item.mean,3) + itemStats <- data.frame(dropif,r.drop,item.mean) + rownames(itemStats) <- attr(alphaRes$item.mean,"names") + } + colnames(itemStats) <- c("Drop if","r dropped","IF") + itemStats2 <- cbind(itemStats,brownRpbi(data,c())) + itemStats <- itemStats2[,c(1, 2, 5, 3, 4)] + + return(list(sumStats,itemStats)) + } + + myAlpha(dat) + + }) + + output$alpha.result.out <- renderPrint({ + alpha.result() + }) + + + + + + data <- reactive({ + + dat <- read.csv(text=input$text1, sep="\t") + options(digits=3) + + if (input$type == "1PL") { + + result <- rasch(dat) + est <- ltm::factor.scores(result) + list(result = result, est = est) + + } else if (input$type == "2PL") { + + result <- ltm(dat ~ z1) + est <- factor.scores(result) + list(result = result, est = est) + + } else { + + result <- tpm(dat) + est <- ltm::factor.scores(result) + list(result = result, est = est) + + } + }) + + + + + + item.est <- reactive({ + + if (input$type == "1PL") { + + est <- data()$est + i.est <- est$coef + i.est + + } else if (input$type == "2PL") { + + est <- data()$est + i.est <- est$coef + i.est + + } else { + + est <- data()$est + i.est <- est$coef + i.est + + } + }) + + output$item.est.out <- renderPrint({ + item.est() + }) + + + + + + person.est <- reactive({ + + if (input$type == "1PL") { + + est <- data()$est + p.est <- data.frame(est$score.dat$z1, est$score.dat$se.z1) + colnames(p.est) <- c("Theta", "SE") + round(p.est, 3) + + } else if (input$type == "2PL") { + + est <- data()$est + p.est <- data.frame(est$score.dat$z1, est$score.dat$se.z1) + colnames(p.est) <- c("Theta", "SE") + round(p.est, 3) + + } else { + + est <- data()$est + p.est <- data.frame(est$score.dat$z1, est$score.dat$se.z1) + colnames(p.est) <- c("Theta", "SE") + round(p.est, 3) + + } + }) + + output$person.est.out <- renderPrint({ + person.est() + }) + + + + + # Item characteristic curves (ICC) Plot + makeICC <- function(){ + + if (input$type == "1PL") { + + result <- data()$result + plot.rasch(result) + + } else if (input$type == "2PL") { + + result <- data()$result + plot.ltm(result) + + } else { + + result <- data()$result + plot.tpm(result) + + } + } + + output$ICC <- renderPlot({ + print(makeICC()) + }) + + + + + + # IIC + makeIIC <- function(){ + + if (input$type == "1PL") { + + result <- data()$result + plot.rasch(result, type="IIC") + + } else if (input$type == "2PL") { + + result <- data()$result + plot.ltm(result, type="IIC") + + } else { + + result <- data()$result + plot.tpm(result, type="IIC") + + } + } + + output$IIC <- renderPlot({ + print(makeIIC()) + }) + + + + + + # TIC + makeTIC <- function(){ + + if (input$type == "1PL") { + + result <- data()$result + plot.rasch(result, type="IIC", items=0) + + } else if (input$type == "2PL") { + + result <- data()$result + plot.ltm(result, type="IIC", items=0) + + } else { + + result <- data()$result + plot.tpm(result, type="IIC", items=0) + + } + } + + output$TIC <- renderPlot({ + print(makeTIC()) + }) + + + + + + + makedistPlot <- function(){ + + x <- read.csv(text=input$text1, sep="\t") + x <- rowSums(x, na.rm=T) + + simple.bincount <- function(x, breaks) { + nx <- length(x) + nbreaks <- length(breaks) + counts <- integer(nbreaks - 1) + for (i in 1:nx) { + lo <- 1 + hi <- nbreaks + if (breaks[lo] <= x[i] && x[i] <= breaks[hi]) { + while (hi - lo >= 2) { + new <- (hi + lo) %/% 2 + if(x[i] > breaks[new]) + lo <- new + else + hi <- new + } + counts[lo] <- counts[lo] + 1 + } + } + return(counts) + } + + nclass <- nclass.FD(x) + breaks <- pretty(x, nclass) + counts <- simple.bincount(x, breaks) + counts.max <- max(counts) + + h <- hist(x, las=1, breaks="FD", xlab= "Red vertical line shows the mean.", + ylim=c(0, counts.max*1.2), main="", col = "cyan") + rug(x) + abline(v = mean(x), col = "red", lwd = 2) + xfit <- seq(min(x), max(x)) + yfit <- dnorm(xfit, mean = mean(x), sd = sd(x)) + yfit <- yfit * diff(h$mids[1:2]) * length(x) + lines(xfit, yfit, col = "blue", lwd = 2) + + + } + + output$distPlot <- renderPlot({ + print(makedistPlot()) + }) + + + + + makeboxPlot <- function(){ + + x <- read.csv(text=input$text1, sep="\t") + x <- rowSums(x, na.rm=T) + + boxplot(x, horizontal=TRUE, xlab= "Mean and +/-1 SD are displayed in red.") + beeswarm(x, horizontal=TRUE, col = 4, pch = 16, add = TRUE) + points(mean(x), 0.9, pch = 18, col = "red", cex = 2) + arrows(mean(x), 0.9, mean(x) + sd(x), length = 0.1, angle = 45, col = "red") + arrows(mean(x), 0.9, mean(x) - sd(x), length = 0.1, angle = 45, col = "red") + } + + output$boxPlot <- renderPlot({ + print(makeboxPlot()) + }) + + + + + info1 <- reactive({ + info1 <- paste("This analysis was performed on ", format(Sys.time(), "%A, %B %d %Y at %I:%M:%S %p"), ".", sep = "") + info2 <- paste(strsplit(R.version$version.string, " \\(")[[1]][1], " was used for this session.", sep = "") + info3 <- paste("Package version infomation for this session:") + info4 <- paste("shiny", packageVersion("shiny")) + info5 <- paste("shinyAce", packageVersion("shinyAce")) + info6 <- paste("psych", packageVersion("psych")) + info7 <- paste("CTT", packageVersion("CTT")) + info8 <- paste("ltm", packageVersion("ltm")) + info9 <- paste("beeswarm", packageVersion("beeswarm")) + + + cat(sprintf(info1), "\n") + cat(sprintf(info2), "\n") + cat(sprintf(info3), "\n") + cat(sprintf(info4), "\n") + cat(sprintf(info5), "\n") + cat(sprintf(info6), "\n") + cat(sprintf(info7), "\n") + cat(sprintf(info8), "\n") + cat(sprintf(info9), "\n") + + }) + + output$info1.out <- renderPrint({ + info1() + }) + + + + + + + + + + +####################################################### +# Polytomous Models +####################################################### + + bs.poly <- reactive({ + + x <- read.csv(text=input$text2, sep="\t") + + result <- psych::describe(x) + + total <- rowSums(x, na.rm=T) + result1 <- psych::describe(total)[2:13] + + y <- rowMeans(x, na.rm=T) + result2 <- psych::describe(y)[2:13] + + row.names(result1) <- "Total" + row.names(result2) <- "Average" + return(list(result2, result1, result)) + }) + + output$bs.poly.out <- renderPrint({ + bs.poly() + }) + + + + + + makedistPlot2 <- function(){ + + x <- read.csv(text=input$text2, sep="\t") + + if (input$meantotal1 == "mean1") { + x <- rowMeans(x, na.rm=T) + } else { + x <- rowSums(x, na.rm=T) + } + + + simple.bincount <- function(x, breaks) { + nx <- length(x) + nbreaks <- length(breaks) + counts <- integer(nbreaks - 1) + for (i in 1:nx) { + lo <- 1 + hi <- nbreaks + if (breaks[lo] <= x[i] && x[i] <= breaks[hi]) { + while (hi - lo >= 2) { + new <- (hi + lo) %/% 2 + if(x[i] > breaks[new]) + lo <- new + else + hi <- new + } + counts[lo] <- counts[lo] + 1 + } + } + return(counts) + } + + nclass <- nclass.FD(x) + breaks <- pretty(x, nclass) + counts <- simple.bincount(x, breaks) + counts.max <- max(counts) + + h <- hist(x, na.rm= T, las=1, breaks="FD", xlab= "Red vertical line shows the mean.", + ylim=c(0, counts.max*1.2), main="", col = "cyan") + rug(x) + abline(v = mean(x, na.rm=T), col = "red", lwd = 2) + xfit <- seq(min(x, na.rm=T), max(x, na.rm=T)) + yfit <- dnorm(xfit, mean = mean(x, na.rm=T), sd = sd(x, na.rm=T)) + yfit <- yfit * diff(h$mids[1:2]) * length(x) + lines(xfit, yfit, col = "blue", lwd = 2) + } + + output$distPlot2 <- renderPlot({ + print(makedistPlot2()) + }) + + + + + + makeboxPlot2 <- function(){ + + x <- read.csv(text=input$text2, sep="\t") + + if (input$meantotal2 == "mean2") { + x <- rowMeans(x, na.rm=T) + } else { + x <- rowSums(x, na.rm=T) + } + + boxplot(x, horizontal=TRUE, xlab= "Mean and +/-1 SD are displayed in red.") + beeswarm(x, horizontal=TRUE, col = 4, pch = 16, add = TRUE) + points(mean(x, na.rm=T), 0.9, pch = 18, col = "red", cex = 2) + arrows(mean(x, na.rm=T), 0.9, mean(x, na.rm=T) + sd(x, na.rm=T), length = 0.1, angle = 45, col = "red") + arrows(mean(x, na.rm=T), 0.9, mean(x, na.rm=T) - sd(x, na.rm=T), length = 0.1, angle = 45, col = "red") + } + + output$boxPlot2 <- renderPlot({ + print(makeboxPlot2()) + }) + + + + + + alpha.result2 <- reactive({ + + dat <- read.csv(text=input$text2, sep="\t") + + brownRpbi <- function(data,missing) { + m <- mean(rowSums(data)) + sd <- sd(rowSums(data)) + totalDat <- cbind(data,rowSums(data)) + sortDat <- totalDat[order(-totalDat[,length(totalDat)]),] + r <- c() + rownames(sortDat) <- c(1:nrow(sortDat)) + for (i in 1:length(data)) { + if (is.element(colnames(data)[i], missing) == F ) { + rtemp <- round(cor(data[,i],totalDat[,ncol(totalDat)]),3) + r <- c(r,rtemp) + } + } + pbiDF <- data.frame(r) + colnames(pbiDF) <- c("r") + return(pbiDF) + } + + myAlpha <- function(data) { + alphaRes <- reliability(data, itemal = T) + if (length(alphaRes$N_person) == 0) { + n <- sprintf("%d",alphaRes$nPerson) + items <- sprintf("%d",alphaRes$nItem) + mean <- sprintf("%.2f",round(alphaRes$scaleMean,2)) + sd <- sprintf("%.2f",round(alphaRes$scaleSD,2)) + alpha <- substring(sprintf("%.3f",round(alphaRes$alpha,3)),2,5) + } else { + n <- sprintf("%d",alphaRes$N_person) + items <- sprintf("%d",alphaRes$N_item) + mean <- sprintf("%.2f",round(alphaRes$scale.mean,2)) + sd <- sprintf("%.2f",round(alphaRes$scale.sd,2)) + alpha <- substring(sprintf("%.3f",round(alphaRes$alpha,3)),2,5) + } + + sumStats <- data.frame(Total=c(n,items,alpha)) + rownames(sumStats) <- c("N","Number of items","Cronbach's alpha") + if (length(alphaRes$N_person) == 0) { + dropif <- round(ifelse(is.na(alphaRes$alphaIfDeleted),0,alphaRes$alphaIfDeleted),3) + r.drop <- round(ifelse(is.na(alphaRes$pBis), 0, alphaRes$pBis),3) + item.mean <- round(alphaRes$itemMean,3) + itemStats <- data.frame(dropif,r.drop) + rownames(itemStats) <- colnames(data) + } else { + dropif <- round(ifelse(is.na(alphaRes$alpha.if.deleted),0,alphaRes$alpha.if.deleted),3) + r.drop <- round(ifelse(is.na(alphaRes$pbis), 0, alphaRes$pbis),3) + item.mean <- round(alphaRes$item.mean,3) + itemStats <- data.frame(dropif,r.drop) + rownames(itemStats) <- attr(alphaRes$item.mean,"names") + } + colnames(itemStats) <- c("Drop if","r dropped") + itemStats <- cbind(itemStats,brownRpbi(data,c())) + + return(list(sumStats,itemStats)) + } + + myAlpha(dat) + + }) + + output$alpha.result2.out <- renderPrint({ + alpha.result2() + }) + + + + + + # Scree Plot + screePlot <- function(){ + + dat <- read.csv(text=input$text2, sep="\t") + psych::scree(dat) + + } + + output$screePlot <- renderPlot({ + print(screePlot()) + }) + + + + + + + polydata <- reactive({ + + dat <- read.csv(text=input$text2, sep="\t") + + if (input$model == "gpcm.mdl") { + + res.gpcm <- gpcm(dat) + list(est1 = res.gpcm) + + } else { + + res.grm <- grm(dat) + list(est2 = res.grm) + + } + }) + + + + + + polyitem.est <- reactive({ + + if (input$model == "gpcm.mdl") { + + est <- polydata()$est1 + + res <- coef(est) + fit <- data.frame(summary(est)[2:4]) + rownames(fit) <- "" + + list("Model Summary"=fit, "Coefficients"=res) + + } else { + + est <- polydata()$est2 + + res <- coef(est) + fit <- data.frame(summary(est)[2:4]) + rownames(fit) <- "" + + list("Model Summary"=fit, "Coefficients"=res) + + } + }) + + output$polyitem.est.out <- renderPrint({ + polyitem.est() + }) + + + + + + polyperson.est <- reactive({ + + if (input$person == "show.theta") { + + if (input$model == "gpcm.mdl") { + + est <- polydata()$est1 + + est <- ltm::factor.scores(est) + + p.est <- data.frame(est$score.dat$z1, est$score.dat$se.z1) + colnames(p.est) <- c("Theta", "SE") + round(p.est, 3) + + } else { + + est <- polydata()$est2 + + est <- ltm::factor.scores(est) + + p.est <- data.frame(est$score.dat$z1, est$score.dat$se.z1) + colnames(p.est) <- c("Theta", "SE") + round(p.est, 3) + + } + } else { + cat("No estimation of theta selected.") + } + }) + + output$polyperson.est.out <- renderPrint({ + polyperson.est() + }) + + + + + + # Item characteristic curves (ICC) Plot + makepolyICC <- function(){ + + dat <- read.csv(text=input$text2, sep="\t") + + # From the input of "Indicate which item to plot:" + num <- input$plot.item + + if (input$model == "gpcm.mdl") { + + est <- polydata()$est1 + + plot.gpcm(est, items = num) + + } else { + + est <- polydata()$est2 + + plot.grm(est, items = num) + + } + + } + + output$polyICC <- renderPlot({ + print(makepolyICC()) + }) + + + + + + # IIC + makepolyIIC <- function(){ + + if (input$model == "gpcm.mdl") { + + est <- polydata()$est1 + + plot.gpcm(est, type="IIC") + + } else { + + est <- polydata()$est2 + + plot.grm(est, type="IIC") + + } + + } + + output$polyIIC <- renderPlot({ + print(makepolyIIC()) + }) + + + + + + # TIC + makepolyTIC <- function(){ + + if (input$model == "gpcm.mdl") { + + est <- polydata()$est1 + + plot.gpcm(est, type="IIC", items=0) + + } else { + + est <- polydata()$est2 + + plot.grm(est, type="IIC", items=0) + + } + + } + + output$polyTIC <- renderPlot({ + print(makepolyTIC()) + }) + + + + +info2 <- reactive({ + info1 <- paste("This analysis was performed on ", format(Sys.time(), "%A, %B %d %Y at %I:%M:%S %p"), ".", sep = "") + info2 <- paste(strsplit(R.version$version.string, " \\(")[[1]][1], " was used for this session.", sep = "") + info3 <- paste("Package version infomation for this session:") + info4 <- paste("shiny", packageVersion("shiny")) + info5 <- paste("shinyAce", packageVersion("shinyAce")) + info6 <- paste("psych", packageVersion("psych")) + info7 <- paste("CTT", packageVersion("CTT")) + info8 <- paste("ltm", packageVersion("ltm")) + info9 <- paste("beeswarm", packageVersion("beeswarm")) + + + cat(sprintf(info1), "\n") + cat(sprintf(info2), "\n") + cat(sprintf(info3), "\n") + cat(sprintf(info4), "\n") + cat(sprintf(info5), "\n") + cat(sprintf(info6), "\n") + cat(sprintf(info7), "\n") + cat(sprintf(info8), "\n") + cat(sprintf(info9), "\n") + +}) + +output$info2.out <- renderPrint({ + info2() +}) + + ### Data Convert +check <- reactive({ + if (input$colname == 0) { + x <- read.table(text=input$text, sep="\t") + x <- as.matrix(x) + + ans <- read.delim(text=input$anskey, sep="\t", fill=TRUE, header=FALSE, stringsAsFactors=FALSE) + ans <- as.character(ans) + dat <- score(x, ans, output.scored=TRUE)$scored + + } else { + + x <- read.csv(text=input$text, sep="\t") + + ans <- read.delim(text=input$anskey, sep="\t", fill=TRUE, header=FALSE, stringsAsFactors=FALSE) + ans <- as.character(ans) + + dat <- score(x, ans, output.scored=TRUE)$scored + } +}) + + +output$check <- renderTable({ + head(check(), n = 10) +}, digits = 0) + +output$downloadData <- downloadHandler( + filename = function() { + paste('Data-', Sys.Date(), '.csv', sep='') + }, + content = function(file) { + write.csv(check(), file) + } +) + + ### Download PDF Plots +output$downloaddistPlot <- downloadHandler( + filename = function() { + paste('distPlot', Sys.Date(), '.pdf', sep='') + }, + content = function(FILE=NULL) { + pdf(file=FILE) + print(makedistPlot()) + dev.off() + } +) + +output$downloadboxPlot <- downloadHandler( + filename = function() { + paste('boxPlot', Sys.Date(), '.pdf', sep='') + }, + content = function(FILE=NULL) { + pdf(file=FILE) + print(makeboxPlot()) + dev.off() + } +) + +output$downloadboxPlot2 <- downloadHandler( + filename = function() { + paste('boxPlot2', Sys.Date(), '.pdf', sep='') + }, + content = function(FILE=NULL) { + pdf(file=FILE) + print(makeboxPlot2()) + dev.off() + } +) + +output$downloaddistPlot2 <- downloadHandler( + filename = function() { + paste('distPlot2', Sys.Date(), '.pdf', sep='') + }, + content = function(FILE=NULL) { + pdf(file=FILE) + print(makedistPlot2()) + dev.off() + } +) + +output$info3.out <- renderPrint({ + info3() +}) + +# R session info + +info3 <- reactive({ + info1 <- paste("This analysis was performed on ", format(Sys.time(), "%A, %B %d %Y at %I:%M:%S %p"), ".", sep = "") + info2 <- paste(strsplit(R.version$version.string, " \\(")[[1]][1], " was used for this session.", sep = "") + info3 <- paste("Package version infomation for this session:") + info4 <- paste("shiny", packageVersion("shiny")) + info5 <- paste("shinyAce", packageVersion("shinyAce")) + info6 <- paste("psych", packageVersion("psych")) + info7 <- paste("CTT", packageVersion("CTT")) + info8 <- paste("ltm", packageVersion("ltm")) + info9 <- paste("beeswarm", packageVersion("beeswarm")) + + + cat(sprintf(info1), "\n") + cat(sprintf(info2), "\n") + cat(sprintf(info3), "\n") + cat(sprintf(info4), "\n") + cat(sprintf(info5), "\n") + cat(sprintf(info6), "\n") + cat(sprintf(info7), "\n") + cat(sprintf(info8), "\n") + cat(sprintf(info9), "\n") + +}) + + +}) diff --git a/inst/IRT/ui.R b/inst/IRT/ui.R new file mode 100644 index 0000000..60f04b1 --- /dev/null +++ b/inst/IRT/ui.R @@ -0,0 +1,328 @@ +library(shiny) +library(shinyAce) + + + +shinyUI(bootstrapPage( + + headerPanel("Item Response Theory"), + + +########## Adding loading message ######### + +tags$head(tags$style(type="text/css", " +#loadmessage { +position: fixed; +top: 0px; +left: 0px; +width: 100%; +padding: 10px 0px 10px 0px; +text-align: center; +font-weight: bold; +font-size: 100%; +color: #000000; +background-color: #CCFF66; +z-index: 105; +} +")), + +conditionalPanel(condition="$('html').hasClass('shiny-busy')", +tags$div("Loading...",id="loadmessage")), + +########## Added up untill here ########## + + + +sidebarPanel( +helpText("Press Quit to exit the application"), +actionButton("quit", "Quit"), + +br() + +), + + + + mainPanel( + tabsetPanel( + + + tabPanel("Dichotomous Models", + + radioButtons("type", strong("Model selection:"), + list("One-parameter logistic model (1PL)" = "1PL", + "Two-parameter logistic model (2PL)" = "2PL", + "Three-parameter logistic model (3PL)" = "3PL" + ), selected = "2PL" + ), + + + br(), + + p('Note: Input values (either numeric or character) must be separated by tabs. Copy and paste from Excel.'), + + p(HTML("
Please make sure that your data includes the header (variable names) in the first row.
")), + + aceEditor("text1", value="Q01\tQ02\tQ03\tQ04\tQ05\tQ06\tQ07\tQ08\tQ09\tQ10\tQ11\tQ12\tQ13\tQ14\tQ15\tQ16\tQ17\tQ18\tQ19\tQ20\tQ21\tQ22\tQ23\tQ24\tQ25\tQ26\tQ27\tQ28\tQ29\tQ30\tQ31\tQ32\tQ33\tQ34\tQ35\tQ36\tQ37\tQ38\tQ39\tQ40\tQ41\tQ42\tQ43\tQ44\tQ45\tQ46\tQ47\tQ48\tQ49\tQ50\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t0\t1\t0\t0\t1\t1\t1\t1\t0\t1\t0\t1\t0\t1\t0\t1\t1\t1\t0\t1\t1\n1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t0\t1\t1\t0\t1\t1\t1\t0\t1\t1\t0\t0\t1\t0\t0\t0\t0\t1\t0\t0\t1\t0\t1\t0\t0\t0\t1\t1\t1\t0\t0\t0\t0\t0\n1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t0\t1\t0\t0\t0\t0\t0\t1\t0\t1\t1\t1\t0\t1\t1\t0\t1\t1\t0\t1\t1\t1\t0\t0\t0\n1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t0\t0\t1\t1\t0\t0\t1\t1\t1\t0\t1\t0\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\n0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t0\t1\t0\t1\t1\t1\t1\t1\t1\t0\t0\t1\t0\t1\t1\t1\t0\t1\t1\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\n0\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t0\t0\t1\t1\t0\t1\t0\t1\t1\t1\t1\t1\t0\t0\t0\t1\t0\t1\t0\t1\t0\t0\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t0\t0\t1\t0\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t0\t1\t1\t0\t0\t1\n0\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t0\t1\t0\t0\t0\t0\t0\t1\t0\t0\t1\t1\t1\t0\t0\t0\t1\t1\t1\t0\t0\t0\t0\t0\n1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t0\t1\t0\t0\t1\t0\t0\t0\t0\t1\t0\t0\t1\t0\t1\t1\t0\t0\t1\t0\t0\t0\t0\t1\n0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t0\t1\t0\t1\t1\t0\t1\t1\t1\t0\t0\t0\t1\t0\t1\t1\t1\t0\n1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t0\t1\t0\t0\t0\t1\t1\t1\t1\t1\t0\t0\t0\t0\t1\t0\t1\t0\t0\t1\t1\t0\t1\t0\n1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t0\t0\t1\t1\t1\t1\t1\t1\n0\t0\t0\t1\t0\t0\t1\t0\t0\t1\t0\t0\t1\t1\t0\t1\t1\t0\t0\t0\t1\t1\t0\t1\t1\t1\t1\t0\t0\t0\t1\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t1\t1\t0\t1\t0\t1\n1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t0\t0\t1\t1\t1\t0\t1\t0\t1\t0\t0\t0\t0\t1\t1\t1\t0\t1\t0\t1\t0\t1\t0\t1\t1\t1\t0\t1\t1\n0\t1\t0\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t0\t0\t1\t1\t1\t0\t0\t0\t0\t1\t0\t1\t1\t0\t0\t0\t0\t1\t0\t0\t0\t0\t1\t0\t0\t1\t1\t0\t0\t1\t0\t0\t0\t0\t1\t0\t0\n1\t1\t1\t1\t1\t1\t0\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t0\t1\t1\t0\t1\t1\t1\t1\t0\t0\t1\t0\t0\t1\t1\t1\t0\t0\t1\t0\t0\t0\t1\t0\t1\t1\t1\t0\t0\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t1\t0\t0\t1\t1\t1\t0\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t0\t1\t0\t1\t0\t1\t1\t1\t1\t0\t0\t1\t0\t0\t0\t0\t1\t0\t1\t1\t0\t0\t0\t1\t0\t1\t1\t1\t1\t1\t0\t0\t0\n1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t0\t1\t1\t0\t1\t0\t1\t1\t1\t0\t1\t1\t0\t1\t0\t0\t0\t0\t1\t0\t1\t1\t1\t0\t1\t0\t1\t1\t0\t0\t1\t1\t1\t0\t0\t0\n0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t0\t0\t1\t0\t0\t1\t1\t1\t1\t0\t1\t0\t1\t0\t1\t0\t0\t1\t1\t0\t1\t1\n1\t1\t1\t1\t1\t1\t0\t0\t1\t1\t1\t1\t1\t0\t0\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t0\t1\t0\t1\t0\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t0\t1\t0\t0\t0\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t0\t1\t0\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t0\t1\t1\t1\t1\t1\t1\t1\t0\t0\t1\t1\t0\t1\t0\t0\t0\t0\t1\t0\t0\t1\t1\t0\t1\t1\t1\t1\t1\t0\t0\t0\t1\t0\t0\t0\n0\t1\t0\t1\t0\t0\t1\t1\t1\t1\t0\t0\t1\t1\t1\t0\t1\t0\t0\t1\t0\t1\t1\t0\t0\t0\t1\t0\t1\t0\t1\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t1\t1\t0\t0\t0\t0\t0\t0\t0\n0\t1\t0\t1\t1\t1\t1\t0\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t0\t1\t1\t1\t0\t1\t1\t0\t0\t0\t0\t1\t0\t1\t1\t0\t0\t1\t1\t1\t0\t0\t1\t0\t0\t0\t0\t1\t0\t0\t0\n1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t1\t0\t0\t0\t0\t1\t0\t0\t1\t1\t1\t1\t0\t1\t0\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t0\t1\t1\t0\t1\t0\t1\t1\t0\t1\t0\t0\t0\t0\t0\t0\t1\t0\t1\t1\t0\t1\t1\t0\t0\t0\t1\t1\t0\t0\t0\n0\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t0\t0\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t1\t1\n0\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t0\t0\t1\t1\t1\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t1\t1\t1\t1\t0\t1\t0\t0\t0\t1\t0\t0\t0\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t0\t0\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t0\t1\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t0\t0\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t0\t1\t1\t1\t0\t0\t1\n1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t0\t1\t1\t1\t0\t1\t1\t0\t1\t1\t0\t1\t0\t0\t1\t1\t1\t1\t0\t1\t0\t0\t0\t0\t0\t1\t1\t1\t0\t0\t0\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t0\t1\t0\t0\t1\t0\t0\t0\t1\t0\t1\t1\t1\t0\t1\t0\t1\t0\t1\t1\t1\t0\t1\t1\n1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t0\t0\t1\t1\t1\t1\t1\t1\t1\t0\t0\t1\t1\t1\t1\t1\t0\t1\t0\t0\t1\t1\t0\t0\t1\t1\t0\t0\t1\t0\t1\t0\t0\t0\t1\t1\t1\t1\t0\t0\n1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t0\t0\t1\t1\t0\t1\t1\t0\t1\t1\t1\t0\t0\t1\t0\t0\t1\t1\n0\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t0\t1\t0\t0\t0\t1\t1\t0\t0\t1\t0\t0\t0\t1\t0\t1\t1\t0\t0\t1\t0\t1\t0\t1\t0\t1\t1\t0\t1\t1\t1\n0\t1\t0\t0\t1\t1\t1\t1\t1\t0\t0\t1\t1\t0\t0\t1\t1\t1\t1\t1\t1\t0\t0\t0\t1\t1\t0\t0\t1\t0\t0\t0\t1\t1\t0\t0\t1\t0\t1\t0\t1\t0\t1\t0\t0\t0\t0\t0\t0\t0\n0\t1\t0\t1\t1\t1\t0\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t0\t1\t1\t0\t1\t1\t0\t0\t0\t1\t0\t0\t1\t1\t0\t0\t0\t1\t0\t1\t0\t0\t1\t0\t0\t0\t0\t1\t1\n0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t1\t1\t1\t0\t1\t1\t0\t0\t0\t1\t1\t1\t0\t1\t1\t1\t0\t0\t0\t0\t0\t1\t1\t0\t1\n1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t0\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t0\t0\t1\t0\t1\t0\t0\t0\t1\t0\t1\t0\t1\t0\t0\t1\t0\t0\t1\t1\t1\t0\t1\n1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t0\t0\t1\t1\t1\t0\t1\t1\t0\t0\t0\t1\t0\t0\t1\t0\t0\t1\t0\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t0\t0\t0\n1\t1\t0\t0\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t0\t1\t0\t1\t1\t1\t1\t1\t1\t0\t0\t0\t1\t1\t1\t1\t0\t1\t0\t0\t0\t0\t0\t1\t1\t1\t0\t0\t0\n1\t1\t1\t1\t1\t1\t0\t0\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t0\t1\t0\t1\t1\t0\t0\t0\t1\t1\t1\t0\t1\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t0\t0\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t0\t1\t1\t1\t0\t1\t1\t0\t1\t0\n1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t0\t1\t1\t1\t0\t1\t0\t1\t1\t1\t1\t0\t1\t1\t0\t0\t1\t1\t0\t1\t0\t0\t1\t0\t1\t1\t0\t0\t1\t0\t0\t1\t1\t1\t0\t0\t1\n1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t1\t0\t0\t0\t1\t1\t0\t0\t1\t1\t1\t0\t1\t0\t0\t0\t0\t0\t0\t1\t1\t0\t0\t1\n0\t1\t1\t0\t1\t0\t1\t0\t0\t0\t0\t1\t1\t0\t1\t1\t1\t1\t0\t0\t1\t0\t0\t1\t0\t1\t1\t0\t0\t0\t0\t0\t0\t1\t0\t1\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t1\t0\t1\t1\n1\t0\t1\t1\t1\t1\t0\t1\t1\t0\t1\t0\t1\t0\t0\t1\t1\t1\t1\t0\t1\t0\t0\t0\t0\t1\t1\t0\t0\t0\t0\t1\t0\t0\t0\t0\t1\t1\t1\t0\t1\t0\t0\t0\t0\t1\t1\t0\t1\t0\n1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t0\t1\t1\t1\t0\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t0\t0\t0\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t0\t1\t1\t0\t0\t0\t0\n1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t0\t0\t0\t1\t0\t0\t0\t1\t1\t1\t0\t1\t0\t0\t0\t0\t1\t1\t0\t1\t0\t0\t0\n1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t0\t0\t0\t0\t1\t1\t0\t0\t1\t1\t0\t0\t1\t0\t0\t0\t0\t1\t0\t0\t1\t0\t1\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\n1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t0\t1\t1\t0\t1\t1\t1\t0\t0\t0\t1\t1\t0\t0\t1\t0\t1\t1\t0\t1\t1\t1\t0\t1\t1\t0\t1\t0\t1\t0\t1\t1\t1\t0\t0\t1\n1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t0\t0\t0\t1\t0\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\n1\t1\t1\t0\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t0\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t0\t1\t1\t0\t1\t0\t0\t1\t1\t0\t0\t1\t1\t1\t0\t0\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t0\t0\t1\t1\t1\t1\t0\t1\t1\t0\t1\t0\t1\t1\t0\t0\t1\t0\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t0\t0\t0\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t0\t0\t0\n1\t1\t0\t0\t1\t1\t0\t1\t0\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t0\t1\t1\t0\t0\t0\t0\t1\t1\t0\t1\t0\t0\t0\t0\t1\t0\t1\t0\t1\t0\t0\t1\t1\t0\t0\t1\n0\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t0\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t0\t1\t1\t1\t1\t1\t1\t1\n1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t0\t1\t1\t1\t0\t1\t0\t1\t0\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t0\t1\t1\t1\t0\t1\t0\n1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t0\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t1\t1\t1\t0\t1\t0\t0\n1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t1\t0\t0\t1\t1\t0\t1\t0\t0\t0\t0\t1\t1\t1\t1\t0\t1\t0\t0\t1\t1\t1\t1\t1\t1\t0\t0\t0\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t0\t1\t1\t1\t1\t1\t1\t0\t1\t1\t0\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t0\t1\t1\t1\t0\t1\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t0\t1\t1\t1\t1\t1\t1\t0\t0\t0\t1\t0\t1\t1\t0\t0\t1\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t0\t0\t1\t1\t1\t1\t1\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t0\t0\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t0\t0\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t0\t0\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t0\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t0\n1\t1\t0\t0\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t0\t1\t0\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t0\t0\t0\t0\t0\t1\t1\t0\t0\t0\t1\t0\t1\t0\t0\t0\t1\t0\t0\t1\t0\t0\n1\t1\t1\t1\t0\t1\t0\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t1\t0\t0\t1\t0\t1\t1\t0\t1\t0\t1\t1\t1\t1\t0\t0\t0\t1\t1\t0\t1\t0\t0\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t0\t1\t1\t0\t0\t0\t0\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t1\t0\t0\t0\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t0\t1\t0\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t0\t1\t0\n0\t1\t1\t0\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t0\t1\t1\t1\t0\t0\t0\t0\t1\t0\t1\t0\t1\t1\t1\t0\t1\t1\t0\t1\t1\t0\t1\t1\t0\t0\t1\t1\n1\t0\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t0\t1\t1\t0\t0\t1\t0\t1\t0\t1\t1\t1\t0\t1\t0\t0\t0\t0\t0\t1\t0\t0\t0\t1\t1\t1\t0\t0\t1\t1\t0\t0\t0\t0\t0\n0\t1\t0\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t0\t0\t1\t1\t0\t0\t0\t1\t1\t1\t1\t1\t1\t0\t0\t1\t0\t1\t1\t1\t1\t0\t1\n1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t0\t0\t0\t0\t0\t0\t1\t1\t1\t0\t1\t0\t1\t1\t1\t0\t0\t1\t1\t0\t0\t0\n1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t0\t0\t1\t0\t0\t1\t1\t1\t1\t0\t1\t0\t0\t1\n0\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t1\t1\t0\t1\t1\t0\t0\t0\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t0\t1\t1\t1\t1\t0\t0\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t1\t0\t1\n1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t0\t1\t1\t0\t1\t1\t1\t0\t0\t1\t0\t1\t0\t1\t0\t0\t1\t1\t1\t1\t1\n1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t0\t1\t1\t1\t1\t1\t1\t1\t0\t0\t0\t1\t1\t0\t1\t0\t1\t1\t0\t1\t0\t0\t0\t0\t1\t1\t1\t1\t0\t0\t0\n1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t0\t1\t0\t0\t1\t1\t1\t1\t1\t0\t1\t0\t0\t0\t1\t0\t1\t1\t1\t0\t1\t0\t0\t1\t1\t0\t1\t1\t0\t1\t0\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t0\t0\n1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t0\t1\t1\t1\t1\t1\t1\t0\t0\t0\t0\t0\t0\t0\t1\t1\t1\t0\t1\t0\t0\t0\t0\t1\t1\t1\t1\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t0\t1\t1\t0\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t0\t0\t1\t1\t0\t0\t1\t1\t1\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t0\t1\t0\t1\t0\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t0\t0\t0\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t0\t1\t0\t1\t0\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t0\t0\n1\t1\t0\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t0\t1\t0\t1\t0\t1\t1\t0\t1\t0\t0\t1\t0\t0\t0\t0\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t0\t0\t1\t0\t1\t0\t1\t1\t1\t1\t1\t1\t1\t0\t1\t0\t1\t1\t1\t0\t0\t1\n1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t1\t1\t1\t0\t1\t0\t0\t1\t0\t1\t1\t1\t1\t1\t0\t1\t0\t1\t0\t1\t0\t0\t1\t1\t0\t1\t1\n1\t1\t1\t1\t1\t0\t0\t0\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t1\t0\t0\t1\t1\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t1\t1\t1\t1\t1\t0\t0\t1\t0\t0\t0\t1\t0\t0\t0\t0\n0\t1\t1\t1\t1\t1\t1\t1\t1\t1\t0\t1\t1\t1\t0\t0\t1\t1\t1\t0\t1\t1\t1\t0\t1\t1\t1\t1\t0\t0\t1\t0\t0\t0\t1\t1\t1\t1\t0\t0\t1\t0\t1\t0\t0\t1\t1\t0\t0\t1", + mode="r", theme="cobalt", height="400px"), + + br(), + + p('If you need to create 1-0 data first, use the Binary (1-0) Data Converter.'), + + br(), + + h3("Basic statistics (Using the raw score)"), + verbatimTextOutput("textarea.out"), + + br(), + + h3("Histogram of the total score (Using the raw score)"), + downloadButton('downloaddistPlot', 'Download the plot as pdf'), + plotOutput("distPlot"), + + br(), + + h3("Boxplot (Using the raw score)"), + downloadButton('downloadboxPlot', 'Download the plot as pdf'), + plotOutput("boxPlot"), + + br(), + + h3("Cronbach's coefficient alpha (Using the raw score)"), + verbatimTextOutput("alpha.result.out"), + + p('Drop if: Cronbach alpha when the item is removed', br(), + 'r dropped: item-total correlation without the item', br(), + 'r: item-total (point-biserial) correlation', br(), + 'IF: item facility or item mean (proportion correct answers)', br(), + 'ID: item discrimination (upper 1/3 - lower 1/3)', br() + ), + + br(), + + h3("Item estimate"), + verbatimTextOutput("item.est.out"), + + br(), + + h3("Person estimate (Theta)"), + verbatimTextOutput("person.est.out"), + + br(), + br(), + + h3("Plots"), + + plotOutput("ICC"), + plotOutput("IIC"), + plotOutput("TIC"), + + br(), + br(), + + strong('R session info'), + verbatimTextOutput("info1.out") + + ), + + + + + tabPanel("Polytomous Models", + + br(), + + p('Note: Input values (either numeric or character) must be separated by tabs. Copy and paste from Excel/Numbers.'), + + p(HTML("
Please make sure that your data includes the header (variable names) in the first row.
")), + + aceEditor("text2", value="i01\ti02\ti03\ti04\n2\t1\t3\t3\n2\t1\t3\t1\n2\t1\t2\t1\n5\t5\t5\t5\n4\t1\t4\t2\n3\t3\t3\t4\n3\t2\t4\t1\n4\t3\t4\t3\n4\t2\t4\t3\n3\t2\t3\t2\n3\t3\t4\t3\n3\t1\t4\t3\n3\t4\t4\t5\n4\t3\t3\t3\n3\t2\t3\t3\n2\t2\t3\t3\n3\t3\t5\t3\n3\t3\t4\t2\n1\t1\t1\t1\n1\t1\t5\t2\n3\t3\t4\t4\n3\t1\t4\t1\n6\t6\t6\t6\n3\t1\t4\t3\n2\t2\t4\t2\n3\t3\t3\t2\n4\t3\t4\t3\n3\t3\t5\t5\n1\t1\t3\t1\n1\t1\t1\t1\n3\t3\t3\t3\n4\t3\t3\t3\n2\t1\t4\t3\n2\t2\t4\t3\n4\t5\t6\t4\n4\t2\t4\t3\n3\t3\t3\t3\n4\t3\t4\t3\n1\t1\t1\t1\n2\t3\t2\t3\n4\t3\t5\t3\n2\t2\t2\t2\n3\t3\t4\t3\n4\t4\t4\t4\n5\t3\t5\t5\n4\t3\t4\t6\n2\t2\t4\t6\n5\t3\t5\t5\n4\t4\t5\t4\n2\t1\t3\t1\n1\t3\t4\t4\n5\t3\t5\t3\n2\t2\t4\t1\n5\t4\t3\t3\n3\t2\t4\t4\n1\t1\t2\t3\n3\t1\t2\t3\n2\t3\t5\t5\n3\t3\t4\t4\n5\t3\t4\t4\n2\t2\t5\t3\n2\t1\t3\t3\n2\t2\t4\t4\n4\t3\t3\t4\n1\t2\t2\t2\n4\t2\t4\t4\n3\t3\t3\t2\n2\t1\t2\t1\n5\t2\t5\t3\n3\t3\t3\t4\n5\t2\t4\t5\n2\t1\t1\t1\n3\t2\t5\t3\n4\t3\t4\t4\n4\t2\t4\t4\n1\t1\t1\t1\n4\t4\t4\t2\n3\t1\t3\t1\n1\t1\t3\t1\n3\t1\t4\t2\n3\t1\t3\t2\n1\t1\t3\t2\n4\t2\t3\t3\n1\t3\t2\t1\n3\t3\t4\t3\n3\t1\t5\t1\n4\t3\t5\t4\n2\t2\t2\t2\n1\t1\t1\t1\n4\t1\t2\t2\n3\t4\t5\t3\n4\t3\t4\t3\n3\t2\t2\t2\n3\t2\t3\t2\n3\t3\t5\t4\n3\t1\t3\t2\n3\t3\t4\t2\n3\t2\t3\t1\n3\t4\t5\t5\n2\t2\t3\t3\n4\t4\t4\t4\n3\t4\t6\t5\n1\t1\t3\t1\n1\t1\t1\t1\n3\t3\t4\t3\n2\t2\t4\t1\n1\t1\t2\t1\n2\t1\t2\t1\n3\t3\t4\t2\n2\t2\t4\t2\n2\t1\t3\t1\n1\t2\t3\t1\n4\t3\t4\t3\n1\t2\t3\t3\n2\t2\t3\t3\n3\t4\t4\t4\n1\t1\t1\t2\n1\t1\t2\t2\n2\t1\t3\t2\n3\t3\t5\t4\n4\t4\t4\t4\n3\t3\t3\t2\n4\t3\t4\t4\n1\t3\t4\t3\n3\t3\t3\t3\n2\t1\t2\t2\n2\t4\t5\t5\n1\t1\t4\t2\n2\t2\t5\t2\n4\t3\t4\t3\n2\t2\t3\t2\n4\t3\t4\t4\n1\t1\t1\t2\n3\t4\t4\t3\n3\t3\t4\t3\n4\t3\t4\t3\n3\t3\t5\t3\n2\t1\t2\t2\n3\t2\t4\t2\n5\t3\t5\t3\n3\t1\t1\t1\n4\t3\t5\t3\n3\t2\t3\t2\n2\t1\t2\t1\n2\t2\t2\t2\n3\t3\t4\t2\n1\t1\t1\t1\n1\t1\t1\t1\n4\t3\t3\t2\n3\t2\t2\t2\n4\t2\t3\t2\n4\t4\t4\t5\n3\t3\t5\t4\n3\t4\t4\t3\n3\t3\t4\t4\n3\t3\t3\t1\n3\t3\t4\t3\n5\t4\t5\t5\n3\t2\t3\t3\n4\t3\t5\t4\n1\t1\t3\t1\n2\t2\t4\t3\n3\t3\t5\t4\n3\t3\t4\t2\n2\t1\t2\t2\n3\t2\t4\t2\n1\t1\t4\t1\n4\t4\t4\t4\n4\t3\t3\t2\n2\t2\t4\t2\n3\t3\t4\t3\n4\t3\t5\t3\n5\t3\t4\t4\n3\t3\t5\t4\n3\t3\t4\t3\n2\t4\t4\t3\n3\t2\t4\t3\n4\t4\t4\t4\n3\t2\t5\t3\n3\t1\t3\t4\n4\t3\t4\t4\n3\t2\t4\t3\n4\t3\t4\t4\n2\t2\t3\t4\n2\t1\t3\t3\n3\t3\t5\t4\n3\t2\t4\t4\n5\t4\t5\t4\n4\t2\t5\t4\n4\t2\t4\t2\n2\t2\t5\t4\n3\t3\t4\t1\n2\t2\t5\t3", + mode="r", theme="cobalt", height="400px"), + + br(), + br(), + + h3("Basic statistics (Using the raw score)"), + verbatimTextOutput("bs.poly.out"), + + br(), + + h3("Histogram"), + radioButtons("meantotal1", "", + list("Average" = "mean1", + "Total" = "total1"), selected = "mean1"), + plotOutput("distPlot2"), + downloadButton('downloaddistPlot2', 'Download the plot as pdf'), + br(), + + h3("Box plot with individual data points"), + + radioButtons("meantotal2", "", + list("Average" = "mean2", + "Total" = "total2"), selected = "mean2"), + plotOutput("boxPlot2"), + downloadButton('downloadboxPlot2', 'Download the plot as pdf'), + br(), + + h3("Cronbach's coefficient alpha (Using the raw score)"), + verbatimTextOutput("alpha.result2.out"), + + p('Drop if: Cronbach alpha when the item is removed', br(), + 'r dropped: item-total correlation without the item', br(), + 'r: item-total (point-biserial) correlation', br() + ), + + br(), + + plotOutput("screePlot"), + + br(), + br(), + + h3("Item estimate"), + + radioButtons("model", strong("Model selection:"), + list("Generalized Parial Credit Model" = "gpcm.mdl", + "Graded Response Model" = "gr.mdl" + ), selected = "gpcm.mdl" + ), + + verbatimTextOutput("polyitem.est.out"), + + br(), + + h3("Person estimate"), + + radioButtons("person", p("Select:"), + list("No estimation of theta (person's ability)" = "no.theta", + "Show estimation of theta" = "show.theta" + ), + ), + + verbatimTextOutput("polyperson.est.out"), + + br(), + br(), + + h3("Plots"), + numericInput("plot.item", "Indicate which item to plot:", 1), + + plotOutput("polyICC"), + + + br(), + + plotOutput("polyIIC"), + + br(), + + plotOutput("polyTIC"), + + br(), + br(), + + strong('R session info'), + verbatimTextOutput("info2.out") + + ), + + + + tabPanel("Binary (1-0) Data Converter", + strong('Option:'), + + + checkboxInput("colname", label = "The input data includes variable names (the header) in the first row.", TRUE), + + br(), + + p('Note: Input values (either numeric or character) must be separated by tabs. Copy and paste from Excel/Numbers.'), + + aceEditor("text", value="i01\ti02\ti03\ti04\ti05\ti06\ti07\ti08\ti09\ti10\ti11\ti12\ti13\ti14\ti15\ti16\ti17\ti18\ti19\ti20\nA\tB\tB\tB\tB\tC\tB\tC\tB\tD\tD\tC\tA\tB\tA\tD\tB\tD\tA\tC\nC\tD\tA\tD\tC\tB\tD\tB\tD\tA\tD\tD\tA\tB\tC\tC\tC\tA\tD\tC\nB\tD\tC\tD\tA\tB\tA\tC\tB\tD\tB\tA\tA\tD\tD\tA\tB\tC\tB\tB\nC\tC\tD\tD\tD\tA\tA\tD\tD\tD\tA\tB\tC\tB\tD\tB\tC\tB\tC\tA\nA\tA\tA\tD\tA\tA\tD\tB\tA\tC\tA\tD\tC\tC\tC\tC\tA\tA\tA\tB\nA\tA\tB\tC\tC\tA\tA\tA\tA\tA\tB\tC\tC\tC\tC\tB\tD\tC\tD\tD\nA\tA\tB\tA\tA\tA\tD\tB\tC\tC\tB\tC\tD\tA\tB\tD\tB\tB\tB\tD\nA\tC\tA\tD\tC\tA\tD\tA\tA\tA\tD\tD\tC\tC\tB\tA\tD\tC\tA\tD\nD\tB\tA\tD\tD\tA\tD\tB\tB\tA\tB\tB\tB\tC\tA\tA\tD\tA\tC\tB\nC\tC\tA\tC\tB\tC\tD\tC\tA\tA\tD\tD\tA\tA\tB\tC\tB\tB\tC\tC\nD\tA\tC\tB\tD\tA\tD\tB\tD\tA\tA\tD\tD\tC\tA\tC\tD\tC\tA\tD\nA\tD\tA\tD\tC\tA\tA\tA\tC\tD\tB\tB\tB\tA\tA\tC\tC\tD\tC\tC\nD\tC\tB\tA\tD\tA\tD\tB\tB\tA\tB\tD\tC\tC\tC\tC\tD\tA\tB\tC\nD\tC\tC\tD\tA\tA\tD\tB\tD\tB\tD\tD\tC\tB\tB\tB\tD\tB\tC\tB\nD\tC\tA\tD\tD\tA\tD\tB\tD\tA\tA\tC\tC\tC\tB\tC\tB\tA\tA\tB\nB\tC\tB\tC\tB\tB\tD\tD\tA\tA\tB\tA\tC\tD\tD\tB\tA\tA\tB\tC\nD\tA\tA\tA\tD\tD\tB\tC\tB\tA\tB\tA\tD\tB\tD\tC\tC\tD\tD\tC\nC\tD\tB\tC\tC\tA\tD\tC\tC\tB\tC\tA\tC\tA\tA\tC\tC\tB\tA\tC\nD\tB\tA\tC\tD\tB\tD\tB\tD\tC\tD\tD\tA\tC\tA\tD\tC\tD\tD\tD\nA\tC\tA\tD\tB\tC\tC\tD\tD\tC\tA\tB\tC\tC\tA\tD\tB\tC\tA\tB\nD\tC\tA\tD\tB\tA\tD\tA\tA\tA\tA\tD\tC\tC\tC\tC\tB\tB\tD\tD\nB\tA\tB\tB\tB\tA\tD\tD\tD\tD\tD\tD\tB\tB\tB\tD\tB\tD\tC\tC\nB\tC\tC\tA\tC\tC\tD\tB\tD\tA\tC\tD\tD\tA\tA\tA\tC\tB\tD\tC\nA\tC\tA\tA\tA\tB\tD\tB\tA\tA\tC\tC\tC\tC\tA\tB\tA\tB\tB\tB\nD\tD\tD\tB\tC\tA\tD\tB\tC\tA\tD\tD\tB\tD\tB\tC\tB\tA\tB\tA\nA\tD\tA\tB\tA\tA\tB\tC\tB\tB\tA\tA\tB\tA\tC\tA\tD\tB\tD\tB\nB\tD\tD\tA\tC\tB\tD\tD\tA\tA\tB\tD\tC\tA\tA\tD\tD\tA\tD\tD\nD\tC\tD\tB\tA\tA\tB\tC\tC\tB\tC\tD\tC\tC\tB\tD\tA\tB\tC\tB\nD\tB\tD\tB\tD\tA\tD\tC\tD\tD\tC\tD\tC\tD\tD\tB\tC\tC\tB\tD\nB\tB\tD\tC\tD\tA\tB\tB\tB\tB\tB\tC\tA\tC\tC\tA\tB\tA\tB\tA\nD\tC\tC\tC\tC\tA\tD\tA\tB\tA\tC\tD\tC\tC\tB\tA\tA\tC\tB\tB\nB\tA\tA\tB\tD\tA\tA\tD\tD\tA\tA\tC\tD\tA\tD\tA\tA\tC\tB\tA\nB\tA\tA\tB\tB\tC\tB\tA\tC\tA\tA\tC\tD\tD\tB\tD\tA\tB\tB\tB\nD\tA\tC\tB\tB\tA\tC\tB\tB\tD\tB\tD\tC\tA\tA\tA\tC\tD\tD\tD\nB\tC\tB\tA\tD\tA\tD\tB\tA\tA\tD\tB\tC\tA\tC\tB\tA\tB\tC\tC\nA\tA\tC\tB\tA\tA\tC\tB\tB\tC\tD\tA\tB\tC\tA\tD\tA\tB\tB\tD\nD\tC\tA\tC\tA\tA\tD\tB\tC\tB\tA\tD\tC\tB\tD\tC\tD\tD\tC\tA\nD\tC\tC\tB\tA\tA\tD\tB\tC\tB\tD\tD\tB\tA\tD\tA\tD\tC\tD\tD\nB\tC\tB\tC\tA\tA\tD\tB\tA\tA\tA\tC\tD\tB\tD\tC\tB\tD\tC\tC\nD\tC\tA\tB\tD\tA\tD\tA\tB\tB\tC\tC\tC\tA\tA\tA\tC\tC\tA\tC\nC\tC\tD\tC\tB\tD\tA\tC\tD\tA\tC\tB\tA\tD\tD\tA\tB\tD\tA\tC\nC\tD\tB\tD\tA\tA\tC\tB\tC\tA\tB\tD\tC\tD\tC\tA\tD\tC\tB\tA\nC\tD\tC\tB\tB\tA\tD\tB\tD\tA\tD\tD\tC\tB\tD\tB\tB\tA\tA\tB\nB\tB\tA\tB\tB\tA\tD\tB\tC\tC\tD\tB\tC\tC\tD\tA\tD\tC\tD\tC\nD\tB\tD\tC\tC\tA\tD\tD\tB\tA\tC\tA\tC\tC\tA\tB\tC\tC\tA\tA\nD\tA\tD\tA\tA\tA\tD\tB\tD\tB\tB\tB\tA\tB\tB\tC\tC\tB\tB\tA\nD\tC\tA\tD\tD\tA\tD\tB\tD\tA\tB\tD\tC\tC\tB\tA\tD\tA\tB\tB\nD\tC\tA\tD\tB\tA\tD\tB\tD\tA\tA\tD\tC\tC\tB\tB\tD\tA\tC\tB\nD\tC\tD\tA\tB\tA\tD\tB\tD\tD\tA\tD\tC\tD\tB\tC\tD\tA\tA\tB\nA\tB\tA\tB\tA\tA\tD\tB\tA\tC\tC\tB\tC\tD\tB\tD\tC\tA\tD\tA\nB\tB\tA\tB\tC\tA\tD\tA\tB\tA\tC\tD\tC\tC\tC\tB\tB\tA\tD\tD\nD\tC\tC\tD\tD\tA\tD\tB\tD\tA\tC\tD\tC\tD\tD\tA\tB\tB\tA\tC\nD\tC\tD\tD\tD\tA\tD\tC\tB\tA\tA\tD\tC\tD\tB\tD\tD\tC\tB\tA\nA\tB\tA\tD\tC\tA\tB\tB\tC\tC\tC\tB\tD\tA\tA\tA\tB\tB\tC\tD\nB\tC\tA\tC\tA\tA\tD\tA\tB\tC\tD\tA\tC\tB\tC\tB\tC\tC\tB\tC\nC\tA\tB\tD\tC\tA\tD\tA\tA\tD\tC\tB\tA\tA\tB\tB\tB\tA\tC\tD\nA\tD\tA\tB\tC\tB\tD\tB\tB\tC\tB\tA\tC\tC\tA\tA\tA\tC\tC\tD\nB\tA\tA\tB\tD\tA\tD\tC\tD\tA\tA\tD\tC\tC\tD\tA\tD\tA\tA\tB\nD\tC\tA\tB\tC\tA\tD\tD\tA\tA\tD\tA\tC\tB\tC\tB\tA\tA\tA\tC\nA\tB\tD\tC\tC\tA\tD\tA\tD\tA\tD\tD\tC\tC\tA\tB\tC\tB\tB\tD\nD\tC\tA\tD\tD\tA\tD\tB\tC\tA\tA\tD\tA\tC\tB\tC\tD\tA\tD\tB\nB\tA\tA\tC\tC\tC\tD\tB\tB\tC\tA\tA\tA\tD\tB\tB\tD\tD\tD\tC\nD\tC\tA\tB\tB\tA\tD\tA\tB\tB\tA\tD\tC\tC\tA\tC\tD\tB\tA\tB\nD\tC\tA\tB\tC\tA\tD\tB\tA\tA\tA\tD\tC\tC\tB\tC\tC\tA\tD\tB\nC\tB\tA\tC\tC\tA\tB\tA\tA\tD\tB\tA\tC\tA\tA\tA\tA\tB\tC\tB\nC\tC\tD\tA\tD\tC\tB\tB\tA\tB\tC\tD\tC\tB\tC\tC\tD\tA\tA\tA\nB\tA\tB\tA\tB\tA\tA\tA\tC\tC\tC\tB\tD\tD\tB\tB\tB\tB\tA\tA\nD\tC\tA\tD\tD\tA\tD\tB\tD\tA\tA\tD\tC\tC\tB\tB\tD\tB\tA\tB\nD\tC\tA\tD\tD\tA\tD\tB\tD\tA\tA\tD\tC\tC\tB\tC\tD\tA\tA\tB\nD\tC\tA\tD\tD\tA\tD\tB\tD\tA\tA\tD\tC\tC\tB\tB\tD\tA\tA\tB\nA\tC\tB\tA\tD\tA\tA\tB\tB\tB\tA\tD\tC\tB\tB\tA\tD\tD\tA\tD\nA\tC\tA\tB\tC\tB\tD\tB\tC\tD\tA\tD\tC\tC\tA\tD\tD\tD\tB\tA\nD\tA\tA\tA\tA\tA\tD\tB\tB\tB\tA\tA\tA\tC\tB\tC\tD\tD\tA\tB\nA\tC\tC\tD\tB\tA\tC\tD\tA\tA\tA\tA\tC\tC\tB\tA\tD\tC\tB\tB\nD\tC\tA\tD\tD\tA\tD\tA\tA\tD\tD\tD\tC\tC\tC\tD\tA\tA\tA\tB\nD\tC\tD\tB\tD\tA\tC\tA\tC\tA\tA\tD\tC\tC\tD\tD\tC\tC\tB\tD\nD\tC\tA\tD\tA\tA\tD\tB\tA\tB\tA\tD\tD\tC\tB\tB\tD\tD\tD\tC\nB\tC\tA\tB\tC\tA\tD\tB\tA\tD\tA\tD\tC\tC\tA\tC\tB\tB\tA\tB\nD\tC\tB\tD\tB\tA\tD\tC\tD\tA\tB\tD\tC\tC\tB\tC\tD\tD\tA\tB\nD\tC\tA\tD\tD\tA\tD\tB\tD\tA\tC\tD\tC\tC\tD\tA\tD\tA\tB\tD\nD\tC\tA\tB\tD\tA\tD\tB\tD\tB\tA\tD\tC\tC\tB\tD\tA\tB\tA\tD\nC\tC\tA\tC\tD\tA\tD\tB\tD\tB\tA\tD\tA\tC\tD\tC\tC\tD\tA\tB\nB\tC\tA\tD\tC\tB\tB\tD\tB\tA\tB\tA\tD\tC\tD\tC\tA\tD\tD\tB\nC\tA\tD\tA\tA\tA\tB\tC\tA\tC\tB\tC\tC\tD\tB\tB\tC\tC\tD\tB\nB\tB\tA\tC\tA\tA\tD\tB\tC\tC\tD\tA\tB\tA\tC\tD\tD\tB\tC\tA\nD\tC\tA\tD\tD\tA\tD\tB\tD\tA\tA\tD\tC\tC\tB\tD\tD\tA\tA\tC\nC\tC\tA\tB\tC\tA\tD\tB\tD\tD\tA\tD\tA\tC\tD\tA\tC\tC\tB\tB\nA\tC\tB\tD\tD\tA\tD\tB\tA\tA\tA\tD\tC\tC\tD\tC\tA\tB\tA\tD\nD\tC\tA\tD\tD\tA\tD\tB\tD\tA\tA\tD\tC\tC\tB\tA\tD\tA\tA\tB\nD\tC\tA\tD\tD\tA\tD\tB\tB\tD\tA\tD\tA\tC\tC\tC\tD\tA\tC\tB\nD\tB\tA\tB\tD\tA\tA\tC\tC\tD\tC\tC\tB\tD\tC\tC\tB\tB\tD\tB\nD\tA\tD\tB\tA\tA\tA\tC\tB\tA\tC\tA\tC\tD\tB\tC\tB\tC\tD\tD\nB\tD\tA\tB\tB\tA\tC\tD\tC\tB\tB\tD\tD\tA\tB\tA\tB\tD\tC\tC\nD\tA\tB\tB\tC\tA\tD\tB\tC\tA\tA\tD\tC\tC\tB\tC\tD\tC\tD\tB\nA\tA\tB\tB\tD\tA\tA\tD\tB\tA\tB\tD\tC\tC\tD\tB\tB\tA\tB\tD\nD\tC\tA\tD\tD\tA\tD\tB\tB\tC\tB\tD\tA\tA\tC\tB\tD\tA\tD\tB\nD\tC\tC\tD\tD\tA\tD\tB\tC\tA\tA\tD\tC\tC\tB\tB\tD\tD\tB\tB\nD\tC\tA\tD\tB\tA\tD\tB\tA\tA\tA\tD\tC\tC\tB\tB\tD\tA\tA\tB\nB\tB\tA\tC\tD\tA\tD\tB\tC\tA\tD\tB\tC\tC\tD\tC\tD\tC\tB\tD\nD\tA\tA\tD\tD\tA\tD\tB\tB\tA\tA\tD\tB\tC\tC\tC\tD\tA\tA\tB", + mode="r", theme="cobalt", height="400px"), + + p("Input answer keys (Either numeric or character, separated by tabs.):"), + + aceEditor("anskey", value="D\tC\tA\tD\tD\tA\tD\tB\tD\tA\tA\tD\tC\tC\tB\tC\tD\tA\tA\tB", mode="r", theme="chrome", height="50px"), + + br(), + + h3("Checking the 1-0 converted data"), + p('Only the first 10 observations are displayed.'), + tableOutput("check"), + + br(), + + downloadButton('downloadData', 'Download the 1-0 data file'), + + br(), + strong('R session info'), + verbatimTextOutput("info3.out"), + + p(br()) + + ), + + tabPanel("About", + strong('IRT with Shiny'), + p("The goal of this project is to help students and researchers run IRT analysis as easily as possible."), + p('This application is developed with', + a("Shiny.", href="http://www.rstudio.com/shiny/", target="_blank"), + ''), + p('The code for this application is available at this', + a('GitHub.', href='https://github.com/kylehamilton/meta', target="_blank")), + + + br(), + + strong('List of Packages Used'), br(), + code('library(shiny)'),br(), + code('library(shinyAce)'),br(), + code('library(psych)'),br(), + code('library(CTT)'),br(), + code('library(ltm)'),br(), + code('library(beeswarm)'),br(), + + + br(), + + h4('Acknowledgments and Authors'), + + strong('Acknowledgments'), + + p('William Kyle Hamilton would like to thank the ', + a("Health Communications and Interventions Lab at UC Merced", href="http://cameronhcilab.com/", target="_blank"), + 'for their comments and beta testing efforts on this application'), + + p('Atsushi Mizumoto would like to thank', + a("Dr. Luke Plonsky", href="http://oak.ucc.nau.edu/ldp3/", target="_blank"), 'and', + a("Dr. Yo In'nami", href="https://sites.google.com/site/yoinnami/", target="_blank"), + 'for their support and feedback to create this web application.'), + + br(), + + + + h5('Authors'), + + HTML('
'), + p(a("William Kyle Hamilton - University of California, Merced", href="http://www.kylehamilton.com", target="_blank")), + p("William Kyle Hamilton maintains this application and has authored new features."), + + br(), + HTML('
'), + p(a("Atsushi Mizumoto, PhD - Kansai University", href="http://mizumot.com", target="_blank"),br(), + p("Atsushi Mizumoto wrote the first version of this application; this application is a fork of the original which can be found", a("here", href="https://github.com/mizumot/irt", target="_blank")) + + + ), + br(), + + + p(br()) + + ) + + )) +)) diff --git a/man/startIRT.Rd b/man/startIRT.Rd new file mode 100644 index 0000000..a5fc940 --- /dev/null +++ b/man/startIRT.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2 (4.0.2.9000): do not edit by hand +% Please edit documentation in R/IRTShiny.R +\name{startIRT} +\alias{startIRT} +\title{This function will start IRTShiny} +\usage{ +startIRT() +} +\value{ +Nothing +} +\description{ +An interactive Shiny application for running a IRT analysis. +} +\details{ +Start IRTShiny + +This starts the Shiny application IRT. +} +\examples{ +\dontrun{ +library(shiny) +startIRT() +} +} +\keyword{IRT} +