Experiments were performed on children on their ability to differentiate a signal in broad-band noise. The noise was played from a pair of speakers and a signal was added to just one channel; the subject had to turn his/her head to the channel with the added signal. The signal was either coherent (the amplitude of the noise was increased for a period) or incoherent (independent noise was added for the same period to form the same increase in power).

The threshold used in the original analysis was the stimulus loudness needs to get 75% correct responses. Some of the children had suffered from otitis media with effusion (OME).

OME

Format

The OME data frame has 1129 rows and 7 columns:

ID

Subject ID (1 to 99, with some IDs missing). A few subjects were measured at different ages.

OME

"low" or "high" or "N/A" (at ages other than 30 and 60 months).

Age

Age of the subject (months).

Loud

Loudness of stimulus, in decibels.

Noise

Whether the signal in the stimulus was "coherent" or "incoherent".

Correct

Number of correct responses from Trials trials.

Trials

Number of trials performed.

Source

Sarah Hogan, Dept of Physiology, University of Oxford, via Dept of Statistics Consulting Service

Background

The experiment was to study otitis media with effusion (OME), a very common childhood condition where the middle ear space, which is normally air-filled, becomes congested by a fluid. There is a concomitant fluctuating, conductive hearing loss which can result in various language, cognitive and social deficits. The term ‘binaural hearing’ is used to describe the listening conditions in which the brain is processing information from both ears at the same time. The brain computes differences in the intensity and/or timing of signals arriving at each ear which contributes to sound localisation and also to our ability to hear in background noise.

Some years ago, it was found that children of 7--8 years with a history of significant OME had significantly worse binaural hearing than children without such a history, despite having equivalent sensitivity. The question remained as to whether it was the timing, the duration, or the degree of severity of the otitis media episodes during critical periods, which affected later binaural hearing. In an attempt to begin to answer this question, 95 children were monitored for the presence of effusion every month since birth. On the basis of OME experience in their first two years, the test population was split into one group of high OME prevalence and one of low prevalence.

Examples

# Fit logistic curve from p = 0.5 to p = 1.0 fp1 <- deriv(~ 0.5 + 0.5/(1 + exp(-(x-L75)/scal)), c("L75", "scal"), function(x,L75,scal)NULL) nls(Correct/Trials ~ fp1(Loud, L75, scal), data = OME, start = c(L75=45, scal=3))
#> Nonlinear regression model #> model: Correct/Trials ~ fp1(Loud, L75, scal) #> data: OME #> L75 scal #> 44.149 3.775 #> residual sum-of-squares: 69.88 #> #> Number of iterations to convergence: 4 #> Achieved convergence tolerance: 7.016e-06
nls(Correct/Trials ~ fp1(Loud, L75, scal), data = OME[OME$Noise == "coherent",], start=c(L75=45, scal=3))
#> Nonlinear regression model #> model: Correct/Trials ~ fp1(Loud, L75, scal) #> data: OME[OME$Noise == "coherent", ] #> L75 scal #> 47.993 1.259 #> residual sum-of-squares: 30.35 #> #> Number of iterations to convergence: 5 #> Achieved convergence tolerance: 4.895e-06
nls(Correct/Trials ~ fp1(Loud, L75, scal), data = OME[OME$Noise == "incoherent",], start = c(L75=45, scal=3))
#> Nonlinear regression model #> model: Correct/Trials ~ fp1(Loud, L75, scal) #> data: OME[OME$Noise == "incoherent", ] #> L75 scal #> 38.87 2.17 #> residual sum-of-squares: 23.73 #> #> Number of iterations to convergence: 11 #> Achieved convergence tolerance: 3.846e-06
# individual fits for each experiment aa <- factor(OME$Age) ab <- 10*OME$ID + unclass(aa) ac <- unclass(factor(ab)) OME$UID <- as.vector(ac) OME$UIDn <- OME$UID + 0.1*(OME$Noise == "incoherent") rm(aa, ab, ac) OMEi <- OME library(nlme) fp2 <- deriv(~ 0.5 + 0.5/(1 + exp(-(x-L75)/2)), "L75", function(x,L75) NULL) dec <- getOption("OutDec") options(show.error.messages = FALSE, OutDec=".") OMEi.nls <- nlsList(Correct/Trials ~ fp2(Loud, L75) | UIDn, data = OMEi, start = list(L75=45), control = list(maxiter=100)) options(show.error.messages = TRUE, OutDec=dec) tmp <- sapply(OMEi.nls, function(X) {if(is.null(X)) NA else as.vector(coef(X))}) OMEif <- data.frame(UID = round(as.numeric((names(tmp)))), Noise = rep(c("coherent", "incoherent"), 110), L75 = as.vector(tmp), stringsAsFactors = TRUE) OMEif$Age <- OME$Age[match(OMEif$UID, OME$UID)] OMEif$OME <- OME$OME[match(OMEif$UID, OME$UID)] OMEif <- OMEif[OMEif$L75 > 30,] summary(lm(L75 ~ Noise/Age, data = OMEif, na.action = na.omit))
#> Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]): contrasts can be applied only to factors with 2 or more levels
summary(lm(L75 ~ Noise/(Age + OME), data = OMEif, subset = (Age >= 30 & Age <= 60), na.action = na.omit), cor = FALSE)
#> Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]): contrasts can be applied only to factors with 2 or more levels
# Or fit by weighted least squares fpl75 <- deriv(~ sqrt(n)*(r/n - 0.5 - 0.5/(1 + exp(-(x-L75)/scal))), c("L75", "scal"), function(r,n,x,L75,scal) NULL) nls(0 ~ fpl75(Correct, Trials, Loud, L75, scal), data = OME[OME$Noise == "coherent",], start = c(L75=45, scal=3))
#> Nonlinear regression model #> model: 0 ~ fpl75(Correct, Trials, Loud, L75, scal) #> data: OME[OME$Noise == "coherent", ] #> L75 scal #> 47.798 1.296 #> residual sum-of-squares: 91.72 #> #> Number of iterations to convergence: 5 #> Achieved convergence tolerance: 9.302e-06
nls(0 ~ fpl75(Correct, Trials, Loud, L75, scal), data = OME[OME$Noise == "incoherent",], start = c(L75=45, scal=3))
#> Nonlinear regression model #> model: 0 ~ fpl75(Correct, Trials, Loud, L75, scal) #> data: OME[OME$Noise == "incoherent", ] #> L75 scal #> 38.553 2.078 #> residual sum-of-squares: 60.19 #> #> Number of iterations to convergence: 8 #> Achieved convergence tolerance: 4.55e-06
# Test to see if the curves shift with age fpl75age <- deriv(~sqrt(n)*(r/n - 0.5 - 0.5/(1 + exp(-(x-L75-slope*age)/scal))), c("L75", "slope", "scal"), function(r,n,x,age,L75,slope,scal) NULL) OME.nls1 <- nls(0 ~ fpl75age(Correct, Trials, Loud, Age, L75, slope, scal), data = OME[OME$Noise == "coherent",], start = c(L75=45, slope=0, scal=2)) sqrt(diag(vcov(OME.nls1)))
#> L75 slope scal #> 0.61091761 0.01665916 0.17566450
OME.nls2 <- nls(0 ~ fpl75age(Correct, Trials, Loud, Age, L75, slope, scal), data = OME[OME$Noise == "incoherent",], start = c(L75=45, slope=0, scal=2)) sqrt(diag(vcov(OME.nls2)))
#> L75 slope scal #> 0.49553854 0.01348281 0.24453836
# Now allow random effects by using NLME OMEf <- OME[rep(1:nrow(OME), OME$Trials),] OMEf$Resp <- with(OME, rep(rep(c(1,0), length(Trials)), t(cbind(Correct, Trials-Correct)))) OMEf <- OMEf[, -match(c("Correct", "Trials"), names(OMEf))] if (FALSE) ## these fail in R on most platforms fp2 <- deriv(~ 0.5 + 0.5/(1 + exp(-(x-L75)/exp(lsc))), c("L75", "lsc"), function(x, L75, lsc) NULL) try(summary(nlme(Resp ~ fp2(Loud, L75, lsc), fixed = list(L75 ~ Age, lsc ~ 1), random = L75 + lsc ~ 1 | UID, data = OMEf[OMEf$Noise == "coherent",], method = "ML", start = list(fixed=c(L75=c(48.7, -0.03), lsc=0.24)), verbose = TRUE)))
#> Error in fp2(Loud, L75, lsc) : could not find function "fp2"
try(summary(nlme(Resp ~ fp2(Loud, L75, lsc), fixed = list(L75 ~ Age, lsc ~ 1), random = L75 + lsc ~ 1 | UID, data = OMEf[OMEf$Noise == "incoherent",], method = "ML", start = list(fixed=c(L75=c(41.5, -0.1), lsc=0)), verbose = TRUE)))
#> Error in fp2(Loud, L75, lsc) : could not find function "fp2"