library(shiny)
library(shinyAce)
library(psych)
library(ltm)
library(CTT)
library(eRm)
library(beeswarm)
shinyServer(function(input, output) {
options(warn = -1)
prepared_data <- reactive({
raw <- if (input$colname == 0) {
read.table(
text = input$text1,
sep = "\t",
header = FALSE,
stringsAsFactors = FALSE,
check.names = FALSE
)
} else {
read.delim(
text = input$text1,
sep = "\t",
header = TRUE,
stringsAsFactors = FALSE,
check.names = FALSE
)
}
if (isTRUE(input$personid)) {
if (ncol(raw) < 2) {
stop("The data must contain one ID column and at least one item column.")
}
ids <- as.character(raw[[1]])
blank_id <- is.na(ids) | trimws(ids) == ""
ids[blank_id] <- paste0("P", which(blank_id))
ids <- make.unique(ids)
dat <- raw[, -1, drop = FALSE]
} else {
dat <- raw
ids <- paste0("P", seq_len(nrow(dat)))
}
if (input$colname == 0) {
colnames(dat) <- paste0("V", seq_len(ncol(dat)))
}
dat[] <- lapply(dat, function(z) as.numeric(as.character(z)))
dat <- as.data.frame(dat, stringsAsFactors = FALSE, check.names = FALSE)
rownames(dat) <- ids
list(
dat = dat,
mat = as.matrix(dat)
)
})
bs <- reactive({
dat <- prepared_data()$dat
total <- rowSums(dat, na.rm = TRUE)
result <- describe(total)[2:13]
row.names(result) <- "Total "
result
})
alpha.result <- reactive({
dat <- prepared_data()$dat
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) == FALSE) {
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 = TRUE)
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)
})
data <- reactive({
dat <- prepared_data()$mat
options(digits = 3)
resRM <- RM(dat)
p.res <- person.parameter(resRM)
list(rasch = resRM, pp = p.res)
})
item.est <- reactive({
resRM <- data()$rasch
ciVal <- qnorm(0.975)
raschTable <- round(
data.frame(
(resRM$betapar * -1),
resRM$se.beta,
((resRM$betapar * -1) - ciVal * resRM$se.beta),
((resRM$betapar * -1) + ciVal * resRM$se.beta)
),
3
)
colnames(raschTable) <- c("Estimate", "Std. Error", "CI low", "CI high")
rownames(raschTable) <- colnames(resRM$X)
raschTable
})
person.est <- reactive({
p.res <- data()$pp
theta_tab <- as.data.frame(p.res$theta.table, check.names = FALSE, stringsAsFactors = FALSE)
ciVal <- qnorm(0.975)
if (ncol(theta_tab) < 2) {
stop("Could not extract person estimates from theta.table.")
}
theta_names <- colnames(theta_tab)
est_col <- if ("Person Parameter" %in% theta_names) "Person Parameter" else theta_names[1]
se_col <- if ("Std.Error" %in% theta_names) "Std.Error" else theta_names[2]
nagroup_col <- if ("NAgroup" %in% theta_names) {
"NAgroup"
} else if (length(theta_names) >= 3) {
theta_names[3]
} else {
NULL
}
interpolated_col <- if ("Interpolated" %in% theta_names) {
"Interpolated"
} else if (length(theta_names) >= 4) {
theta_names[4]
} else {
NULL
}
person_ids <- rownames(theta_tab)
if (is.null(person_ids) || all(person_ids == "")) {
person_ids <- paste0("P", seq_len(nrow(theta_tab)))
}
raw_score <- rowSums(prepared_data()$dat, na.rm = TRUE)
if (!is.null(names(raw_score)) && all(person_ids %in% names(raw_score))) {
raw_score <- raw_score[person_ids]
} else {
raw_score <- raw_score[seq_len(nrow(theta_tab))]
}
out <- data.frame(
ID = person_ids,
`Raw score` = as.numeric(raw_score),
Estimate = round(as.numeric(theta_tab[[est_col]]), 3),
`Std. Error` = round(as.numeric(theta_tab[[se_col]]), 3),
`CI low` = round(as.numeric(theta_tab[[est_col]]) - ciVal * as.numeric(theta_tab[[se_col]]), 3),
`CI high` = round(as.numeric(theta_tab[[est_col]]) + ciVal * as.numeric(theta_tab[[se_col]]), 3),
check.names = FALSE,
row.names = NULL,
stringsAsFactors = FALSE
)
if (!is.null(nagroup_col)) {
out$NAgroup <- theta_tab[[nagroup_col]]
}
if (!is.null(interpolated_col)) {
out$Interpolated <- theta_tab[[interpolated_col]]
}
out
})
item.fit <- reactive({
p.res <- data()$pp
itemfit(p.res)
})
person.fit <- reactive({
p.res <- data()$pp
personfit(p.res)
})
compare <- reactive({
if (input$compare == 1) {
p.res <- data()$pp
options(digits = 3)
list("Comparison of raw scores and theta" = p.res)
}
})
makecompPlot <- function() {
if (input$compare == 1) {
p.res <- data()$pp
plot(p.res)
}
}
output$compPlot <- renderPlot({
print(makecompPlot())
})
makepiMap <- function() {
if (input$map == 1) {
resRM <- data()$rasch
plotPImap(resRM, sorted = TRUE)
}
}
output$piMap <- renderPlot({
print(makepiMap())
})
makepathMap <- function() {
if (input$path == 1) {
dat <- prepared_data()$mat
options(digits = 3)
dat <- dat[rowSums(dat, na.rm = TRUE) != ncol(dat), , drop = FALSE]
resRM <- RM(dat)
pparm <- person.parameter(resRM)
plotPWmap(resRM, pp = pparm, pmap = TRUE)
}
}
output$pathMap <- renderPlot({
print(makepathMap())
})
makeICC <- function() {
if (input$icc == 1) {
dat <- prepared_data()$mat
plot.rasch(rasch(dat))
}
}
output$ICC <- renderPlot({
print(makeICC())
})
makedistPlot <- function() {
x <- rowSums(prepared_data()$dat, na.rm = TRUE)
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 <- rowSums(prepared_data()$dat, na.rm = TRUE)
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())
})
info <- reactive({
info1 <- paste("This analysis was conducted with ", strsplit(R.version$version.string, " \\(")[[1]][1], ".", sep = "")
info2 <- paste("It was executed on ", date(), ".", sep = "")
cat(sprintf(info1), "\n")
cat(sprintf(info2), "\n")
})
output$info.out <- renderPrint({
info()
})
output$textarea.out <- renderPrint({
bs()
})
output$item.est.out <- renderPrint({
item.est()
})
output$person.est.out <- renderPrint({
person.est()
})
output$item.fit.out <- renderPrint({
item.fit()
})
output$person.fit.out <- renderPrint({
person.fit()
})
output$alpha.result.out <- renderPrint({
alpha.result()
})
output$compare.out <- renderPrint({
compare()
})
})
library(shiny)
library(shinyAce)
shinyUI(bootstrapPage(
headerPanel("Rasch Model (1PL IRT)"),
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")
),
mainPanel(
tabsetPanel(
tabPanel(
"Main",
strong("Option:"),
checkboxInput(
"colname",
label = "The input data includes variable names (the header) in the first row.",
TRUE
),
checkboxInput(
"personid",
label = "The first column contains person IDs and should not be used for analysis. If unchecked, IDs are automatically assigned as P1, P2, P3, and so on.",
FALSE
),
br(),
p(
"Note: Input values must be separated by tabs. Copy and paste from Excel/Numbers. ",
"When the person-ID option is checked, the first column is treated as examinee IDs only and is excluded from the analysis."
),
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 ",
a(
"Binary (1-0) Data Converter",
href = "https://langtest4.shinyapps.io/biconv",
target = "_blank"
),
"."
),
br(),
h3("Basic statistics (Using the raw score)"),
verbatimTextOutput("textarea.out"),
br(),
h3("Histogram of the total score (Using the raw score)"),
plotOutput("distPlot"),
br(),
h3("Boxplot (Using the raw score)"),
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(),
h3("Item fit"),
verbatimTextOutput("item.fit.out"),
br(),
h3("Person fit"),
verbatimTextOutput("person.fit.out"),
br(),
p(strong("Plot Options:")),
checkboxInput("compare", label = "Show comparison of raw scores and theta", FALSE),
checkboxInput("map", label = "Plot person-item map", FALSE),
checkboxInput("path", label = "Plot pathway map (Bond & Fox, 2001, 2007)", FALSE),
checkboxInput("icc", label = "Plot ICC (item characteristic curves)", FALSE),
br(),
verbatimTextOutput("compare.out"),
plotOutput("compPlot", width = "70%"),
br(),
plotOutput("piMap"),
br(),
plotOutput("pathMap"),
br(),
plotOutput("ICC"),
br(),
br(),
strong("R session info"),
verbatimTextOutput("info.out")
),
tabPanel(
"About",
strong("Note"),
p(
"This web application is developed with ",
a("Shiny.", href = "http://www.rstudio.com/shiny/", target = "_blank")
),
br(),
strong("List of Packages Used"), br(),
code("library(shiny)"), br(),
code("library(shinyAce)"), br(),
code("library(psych)"), br(),
code("library(ltm)"), br(),
code("library(CTT)"), br(),
code("library(eRm)"), br(),
code("library(beeswarm)"), br(),
br(),
br(),
strong("Code"),
p(
"Source code for this application is based on ",
a(
'"The handbook of Research in Foreign Language Learning and Teaching" (Takeuchi & Mizumoto, 2012).',
href = "http://mizumot.com/handbook/",
target = "_blank"
),
" I also referred to the code used in ",
a("MacR.", href = "https://sites.google.com/site/casualmacr/", target = "_blank")
),
p(
"The code for this web application is available at ",
a("GitHub.", href = "https://github.com/mizumot/rasch", target = "_blank")
),
p(
"If you want to run this code on your computer (in a local R session), run the code below:", br(),
code("library(shiny)"), br(),
code('runGitHub("rasch","mizumot")')
),
br(),
strong("Citation in Publications"),
p("Mizumoto, A. (2015). Langtest (Version 1.0) [Web application]. Retrieved from http://langtest.jp"),
br(),
strong("Article"),
p(
"Mizumoto, A., & Plonsky, L. (2015). ",
a(
"R as a lingua franca: Advantages of using R for quantitative research in applied linguistics.",
href = "http://applij.oxfordjournals.org/content/early/2015/06/24/applin.amv025.abstract",
target = "_blank"
),
em("Applied Linguistics,"),
" Advance online publication. doi:10.1093/applin/amv025"
),
br(),
strong("Recommended"),
p(
"To learn more about R, I suggest this excellent and free e-book (pdf), ",
a(
"A Guide to Doing Statistics in Second Language Research Using R,",
href = "http://cw.routledge.com/textbooks/9780805861853/guide-to-R.asp",
target = "_blank"
),
" written by Dr. Jenifer Larson-Hall."
),
p(
"Also, if you are a cool Mac user and want to use R with GUI, ",
a("MacR", href = "https://sites.google.com/site/casualmacr/", target = "_blank"),
" is definitely the way to go!"
),
br(),
strong("Author"),
p(
a("Atsushi MIZUMOTO,", href = "http://mizumot.com", target = "_blank"),
" Ph.D.", br(),
"Professor of Applied Linguistics", br(),
"Faculty of Foreign Language Studies /", br(),
"Graduate School of Foreign Language Education and Research,", br(),
"Kansai University, Osaka, Japan"
),
br(),
a(
img(src = "http://i.creativecommons.org/p/mark/1.0/80x15.png"),
target = "_blank",
href = "http://creativecommons.org/publicdomain/mark/1.0/"
),
p(br())
)
)
)
))