Consider the outcome of a brightness discrimination experiment. On each trial, two patches of light were presented: one was a standatd with an intensity of 35 units, and another was a variable intensity comparison light. The subject was asked to indicate which one of the lights was brighter.
Source: Gegenfurtner, K. (1992). Praxis: Brent’s algorithm for function minimization. Behavior Research Methods, Instruments, and Computers. 24(4), 560-564.
Stimulu Intensity Trial “Yes” 1 10 49 2 2 20 48 3 3 30 48 13 4 40 50 31 5 50 47 38 6 60 49 48
Column 1: Stimulus condition Column 2: Intensity of the variable (comparison) light Column 3: Number of comparisons Column 4: Number of times comparison light was judged brighter
# input data
dta <- read.table("brightness.txt", h=T)
head(dta)
## Stimulus Intensity Trial Yes
## 1 1 10 49 2
## 2 2 20 48 3
## 3 3 30 48 13
## 4 4 40 50 31
## 5 5 50 47 38
## 6 6 60 49 48
# observed proportions
dta$Prop <- dta$Yes/dta$Trial #Yes佔Trail的比率
# use glm to fit a psychophysical function
summary(m0 <- glm(cbind(Yes, Trial - Yes) ~ Intensity, data = dta, family = binomial(link = "probit"))) #計算累積機率密度
##
## Call:
## glm(formula = cbind(Yes, Trial - Yes) ~ Intensity, family = binomial(link = "probit"),
## data = dta)
##
## Deviance Residuals:
## 1 2 3 4 5 6
## 1.0388 -0.7613 -0.3124 0.4486 -0.5979 0.7050
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.874139 0.286787 -10.02 <2e-16 ***
## Intensity 0.077472 0.007367 10.52 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 184.5899 on 5 degrees of freedom
## Residual deviance: 2.8119 on 4 degrees of freedom
## AIC: 26.549
##
## Number of Fisher Scoring iterations: 4
光的強度增加一單位,Z score 增加0.077。
# new values in the intensity range
newxval <- with(dta, data.frame(Intensity = seq(5,70, by = 0.5)))
# predicted probabilities
phat <- predict(m0, newdata = newxval, type = "response" )
library(ggplot2)
ot <- theme_set(theme_bw())
#fitted psychophysical curve
ggplot() +
geom_line(aes(x=newxval[,1], y = phat)) +
geom_point(aes(x = dta$Intensity, y = dta$Prop)) +
geom_vline(xintercept = 35, lty = 2, col = "gray") +
geom_hline(yintercept = .5, lty = 2, col = "gray") +
labs(x = "Intensity", y = "Probability of correnct responses")