Accuracy Analyses for Learning Session

Data Files

#Libraries
library(itsadug)
library(sciplot)
library(gplots)
library(boot)
library(parallel)
library(dplyr)
library(mgcv)
#Data are in two files, one for the category-learning group, and one for the paired-associate-learning group
#Category learning
dat1<-read.table("train_cat.txt", header=T)

#convert to factor
dat1$sbj<-as.factor(dat1$sbj); dat1$group<-as.factor(dat1$group);dat1$sub<-as.factor(dat1$sub);
dat1$stim<-as.factor(dat1$stim);dat1$corr_resp<-as.factor(dat1$corr_resp);
dat1$cnd<-as.factor(dat1$cnd); dat1$item<-as.factor(dat1$item)

#change name of "stim" to "shape"
names(dat1)[names(dat1) == "stim"] <- "shape"

#re-order based on trial
dat1<-dat1[order(dat1$sbj,dat1$trial),]

#in the DMDX scipt, no response is coded as -10000. Make necessary conversions 
dat1$rt<-ifelse(dat1$rt==-10000,NA, dat1$rt)

str(dat1)
## 'data.frame':    6912 obs. of  11 variables:
##  $ sbj      : Factor w/ 24 levels "aggfyt95","agkxri94",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ trial    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ item     : Factor w/ 288 levels "11013124","11021423",..: 5 78 222 77 73 2 147 220 145 74 ...
##  $ rt       : num  -4741 -2159 -2570 -3123 2215 ...
##  $ group    : Factor w/ 1 level "CAT": 1 1 1 1 1 1 1 1 1 1 ...
##  $ sub      : Factor w/ 8 levels "s1","s2","s3",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ acc      : int  0 0 0 0 1 0 0 0 0 1 ...
##  $ shape    : Factor w/ 4 levels "rand21","rand22",..: 2 3 4 3 3 2 1 4 1 3 ...
##  $ stim_    : chr  "s4rand22" "s4rand23" "s4rand30" "s4rand23" ...
##  $ corr_resp: Factor w/ 4 levels "ideo1","ideo2",..: 2 1 3 1 1 2 4 3 4 1 ...
##  $ cnd      : Factor w/ 2 levels "ideo","pseudo": 1 1 2 1 1 1 2 2 2 1 ...
# Paired-associate learning
dat2<-read.table("train_pa.txt", header=T)

#convert to factor
dat2$sbj<-as.factor(dat2$sbj); dat2$group<-as.factor(dat2$group);dat2$sub<-as.factor(dat2$sub);
dat2$stim<-as.factor(dat2$stim);dat2$corr_resp<-as.factor(dat2$corr_resp);
dat2$cnd<-as.factor(dat2$cnd); dat2$item<-as.factor(dat2$item)

#change name of "stim" variable to "shape"
names(dat2)[names(dat2) == "stim"] <- "shape"

#re-order based on trial
dat2<-dat2[order(dat2$sbj,dat2$trial),]

#in the DMDX scipt, no response is coded as -10000. Make necessary conversions 
dat2$rt<-ifelse(dat2$rt==-10000,NA, dat2$rt)

str(dat2)
## 'data.frame':    6912 obs. of  11 variables:
##  $ sbj      : Factor w/ 24 levels "agkart97","anakou97",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ trial    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ item     : Factor w/ 288 levels "11013124","11021423",..: 5 78 222 77 73 2 147 220 145 74 ...
##  $ rt       : num  -1092 -2465 -1631 -1894 699 ...
##  $ group    : Factor w/ 1 level "PA": 1 1 1 1 1 1 1 1 1 1 ...
##  $ sub      : Factor w/ 8 levels "s1","s2","s3",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ acc      : int  0 0 0 0 1 0 0 0 0 1 ...
##  $ shape    : Factor w/ 4 levels "rand21","rand22",..: 2 3 4 3 3 2 1 4 1 3 ...
##  $ stim_    : chr  "s3rand22" "s3rand23" "s3rand30" "s3rand23" ...
##  $ corr_resp: Factor w/ 4 levels "ideo1","ideo2",..: 2 1 4 1 1 2 3 4 3 1 ...
##  $ cnd      : Factor w/ 2 levels "ideo","pseudo": 1 1 2 1 1 1 2 2 2 1 ...
#Combine data into one data frame 
dat<-rbind(dat1, dat2)
str(dat)
## 'data.frame':    13824 obs. of  11 variables:
##  $ sbj      : Factor w/ 48 levels "aggfyt95","agkxri94",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ trial    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ item     : Factor w/ 288 levels "11013124","11021423",..: 5 78 222 77 73 2 147 220 145 74 ...
##  $ rt       : num  -4741 -2159 -2570 -3123 2215 ...
##  $ group    : Factor w/ 2 levels "CAT","PA": 1 1 1 1 1 1 1 1 1 1 ...
##  $ sub      : Factor w/ 8 levels "s1","s2","s3",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ acc      : int  0 0 0 0 1 0 0 0 0 1 ...
##  $ shape    : Factor w/ 4 levels "rand21","rand22",..: 2 3 4 3 3 2 1 4 1 3 ...
##  $ stim_    : chr  "s4rand22" "s4rand23" "s4rand30" "s4rand23" ...
##  $ corr_resp: Factor w/ 4 levels "ideo1","ideo2",..: 2 1 3 1 1 2 4 3 4 1 ...
##  $ cnd      : Factor w/ 2 levels "ideo","pseudo": 1 1 2 1 1 1 2 2 2 1 ...

Preprocessing

#Count Non-Available Data (missing data points)
#Category learning
sum(is.na(dat[dat$group=="CAT",]$rt))
## [1] 3
#Paired-Associate Learning
sum(is.na(dat[dat$group=="PA",]$rt))
## [1] 4
#Calculate Percentage
(sum(is.na(dat[dat$group=="CAT",]$rt)) + sum(is.na(dat[dat$group=="PA",]$rt)))/length(dat$rt)
## [1] 0.0005063657
#Calculate number of trials with |rt|<250.
# (In DMDX, an incorrect response has a negative rt. Thus, RTs may be positive or negative)
#Category Learning
sum(ifelse((dat[dat$group=="CAT",]$rt<250)&(dat[dat$group=="CAT",]$rt>-250),1,0), na.rm=TRUE)
## [1] 0
#Paired-Associate Learning
sum(ifelse((dat[dat$group=="PA",]$rt<250)&(dat[dat$group=="PA",]$rt>-250),1,0), na.rm=TRUE)
## [1] 5
#Calculate Percentage
sum(ifelse((dat[dat$group=="PA",]$rt<250)&(dat[dat$group=="PA",]$rt>-250),1,0), na.rm=TRUE)/length(dat$rt)
## [1] 0.0003616898
#Convert trials with |rt|<250 to NA
dat$rt<-ifelse(((dat$rt<250)&(dat$rt>-250)),NA, dat$rt)

#... and accordingly adjust the acc column
dat$acc<-NA
dat$acc<-ifelse(dat$rt>0, 1,0)

Descriptive Statistics

#Calculate average performance by participant and group
temp2<-aggregate(acc~sbj+group, data=dat, mean, na.rm=T)
temp2<-temp2[order(temp2$sbj, temp2$group),]

#Category Learning
mean(temp2[temp2$group=='CAT',]$acc)
## [1] 0.8882482
sd(temp2[temp2$group=='CAT',]$acc)
## [1] 0.0574847
#Calculate average performance by condition (label or ideogram categories)
t1<-aggregate(acc~sbj+cnd, data=dat1, mean, na.rm=T)

#Label Categories
mean(t1[t1$cnd=='pseudo',]$acc)
## [1] 0.9050926
sd(t1[t1$cnd=='pseudo',]$acc)
## [1] 0.05728976
#Ideogram Categories
mean(t1[t1$cnd=='ideo',]$acc)
## [1] 0.8706597
sd(t1[t1$cnd=='ideo',]$acc)
## [1] 0.06760277
#Paired-Associate Learning
mean(temp2[temp2$group=='PA',]$acc)
## [1] 0.8826085
sd(temp2[temp2$group=='PA',]$acc)
## [1] 0.0556735
#Calculate average performance by condition (label or ideogram pairings)
t2<-aggregate(acc~sbj+cnd, data=dat2, mean, na.rm=T)

#Label pairs
mean(t2[t2$cnd=='pseudo',]$acc)
## [1] 0.8790509
sd(t2[t2$cnd=='pseudo',]$acc)
## [1] 0.06468979
#Ideogram pairs
mean(t2[t2$cnd=='ideo',]$acc)
## [1] 0.8842593
sd(t2[t2$cnd=='ideo',]$acc)
## [1] 0.06564698
#Create new data frames, average performance by block of trials, for graphs
#12 blocks of 24 trials
n_blocks<-12
n_parts<-length(levels(dat$sbj))
n_cnds<-2  
n_trials_in_block<-24
n_trials_in_block_per_cnd<-n_trials_in_block/n_cnds
block<-rep(1:n_blocks,n_parts)
sbjs<-dat[dat$trial<(n_blocks+1),]$sbj
groups<-dat[dat$trial<(n_blocks+1),]$group

perf_ps<-0; perf_ps[1:(n_parts*n_blocks)]<-0
perf_id<-0; perf_id[1:(n_parts*n_blocks)]<-0
for (i in 1:(n_parts*n_blocks)){
  perf_ps[i]<-mean(dat[dat$cnd=="pseudo",]$acc[((i-1)*n_trials_in_block_per_cnd+1):(i*n_trials_in_block_per_cnd)], na.rm=TRUE) 
  perf_id[i]<-mean(dat[dat$cnd=="ideo",]$acc[((i-1)*n_trials_in_block_per_cnd+1):(i*n_trials_in_block_per_cnd)], na.rm=TRUE)
}

data_bl<-data.frame(sbj=sbjs, block=block, group=groups, perf_ps= perf_ps, perf_id= perf_id)

#First calculate average
with(data_bl,aggregate(perf_ps,list(block,group),mean, na.rm=TRUE, na.action=NULL))->data_gr_ps
with(data_bl,aggregate(perf_id,list(block,group),mean, na.rm=TRUE, na.action=NULL))->data_gr_id
names(data_gr_ps)<-c("block","group", "perf_ps")
names(data_gr_id)<-c("block", "group", "perf_id")

#Then calculate se
with(data_bl,aggregate(perf_ps,list(block, group),se))->data_gr_ps_se
with(data_bl,aggregate(perf_id,list(block, group),se))->data_gr_id_se
names(data_gr_ps_se)<-c("block","group", "perf_ps_se")
names(data_gr_id_se)<-c("block","group", "perf_id_se")

#Data frames for graphs
data_gr<-data.frame(block=data_gr_ps$block, group=data_gr_ps$group, perf_ps=data_gr_ps$perf_ps, perf_id=data_gr_id$perf_id, perf_ps_se=data_gr_ps_se$perf_ps_se, perf_id_se=data_gr_id_se$perf_id_se )

data_gr_CAT<-droplevels(data_gr[data_gr$group=="CAT",])
data_gr_PA<-droplevels(data_gr[data_gr$group=="PA",])

Inferential Statistics - Model Comparison

data<-dat
data$igc <- as.factor(paste(as.character(data$group),as.character(data$cnd),sep=".")) # create variable, "treatment coding".
data$igc<-relevel(data$igc, ref="CAT.pseudo")
levels(data$igc)
## [1] "CAT.pseudo" "CAT.ideo"   "PA.ideo"    "PA.pseudo"
nc <- detectCores()
cl <- makeCluster(nc-1) # change to nc to use all the cores

m1<- bam(acc~ 1 + group*cnd + s(trial) + s(trial, sbj, bs="fs", m=1), data=data, family=binomial )
## Warning in gam.side(sm, X, tol = .Machine$double.eps^0.5): model has repeated 1-
## d smooths of same variable.
gam.check(m1)
## 
## Method: fREML   Optimizer: perf newton
## full convergence after 4 iterations.
## Gradient range [-3.267317e-09,2.161951e-10]
## (score 17944.47 & scale 1).
## Hessian positive definite, eigenvalue range [1.342041,27.68244].
## Model rank =  445 / 445 
## 
## Basis dimension (k) checking results. Low p-value (k-index<1) may
## indicate that k is too low, especially if edf is close to k'.
## 
##                  k'    edf k-index p-value
## s(trial)       9.00   5.06    0.97    0.20
## s(trial,sbj) 432.00 149.60    0.97    0.19
#edf is not close to k', so we are ok. we do not need to increase k
#plot.gam(m1,pages=1)
summary(m1)
## 
## Family: binomial 
## Link function: logit 
## 
## Formula:
## acc ~ 1 + group * cnd + s(trial) + s(trial, sbj, bs = "fs", m = 1)
## 
## Parametric coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        3.19532    0.19491  16.394  < 2e-16 ***
## groupPA            0.14304    0.25359   0.564    0.573    
## cndpseudo          0.54797    0.09699   5.650 1.61e-08 ***
## groupPA:cndpseudo -0.63026    0.13402  -4.703 2.57e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##                 edf  Ref.df Chi.sq p-value    
## s(trial)       5.06   5.954  339.3  <2e-16 ***
## s(trial,sbj) 149.60 430.000  757.6  <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.376   Deviance explained = 42.3%
## fREML =  17944  Scale est. = 1         n = 13812
# add a term modeling four smooth terms of trial, one for each igc level 
m2 <- bam(acc~ 1 + group*cnd + s(trial) + s(trial,by=igc,m=1) + s(trial, sbj, bs="fs", m=1), data=data, family=binomial )
## Warning in gam.side(sm, X, tol = .Machine$double.eps^0.5): model has repeated 1-
## d smooths of same variable.
gam.check(m2)
## 
## Method: fREML   Optimizer: perf newton
## full convergence after 13 iterations.
## Gradient range [-1.294104e-05,4.240583e-08]
## (score 17976.23 & scale 1).
## Hessian positive definite, eigenvalue range [1.015973e-05,27.59699].
## Model rank =  477 / 477 
## 
## Basis dimension (k) checking results. Low p-value (k-index<1) may
## indicate that k is too low, especially if edf is close to k'.
## 
##                              k'      edf k-index p-value
## s(trial)               9.00e+00 5.04e+00    0.96    0.32
## s(trial):igcCAT.pseudo 8.00e+00 1.26e+00    0.96    0.28
## s(trial):igcCAT.ideo   8.00e+00 1.39e-02    0.96    0.28
## s(trial):igcPA.ideo    8.00e+00 3.48e-05    0.96    0.33
## s(trial):igcPA.pseudo  8.00e+00 3.70e-05    0.96    0.29
## s(trial,sbj)           4.32e+02 1.50e+02    0.96    0.37
#edf is not close to k', and p is not low, so we are ok. we do not need to increase k
#plot.gam(m2,pages=1)
summary(m2)
## 
## Family: binomial 
## Link function: logit 
## 
## Formula:
## acc ~ 1 + group * cnd + s(trial) + s(trial, by = igc, m = 1) + 
##     s(trial, sbj, bs = "fs", m = 1)
## 
## Parametric coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)         3.1642     0.1967  16.083  < 2e-16 ***
## groupPA             0.1582     0.2548   0.621    0.535    
## cndpseudo           0.6894     0.1515   4.552 5.32e-06 ***
## groupPA:cndpseudo  -0.7717     0.1774  -4.349 1.37e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##                              edf  Ref.df  Chi.sq p-value    
## s(trial)               5.040e+00   5.928 318.903  <2e-16 ***
## s(trial):igcCAT.pseudo 1.259e+00   8.000   2.500  0.0788 .  
## s(trial):igcCAT.ideo   1.393e-02   8.000   0.014  0.1487    
## s(trial):igcPA.ideo    3.477e-05   8.000   0.000  0.7328    
## s(trial):igcPA.pseudo  3.702e-05   8.000   0.000  0.8275    
## s(trial,sbj)           1.496e+02 430.000 756.025  <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.376   Deviance explained = 42.3%
## fREML =  17976  Scale est. = 1         n = 13812
compareML(m1,m2)
## m1: acc ~ 1 + group * cnd + s(trial) + s(trial, sbj, bs = "fs", m = 1)
## 
## m2: acc ~ 1 + group * cnd + s(trial) + s(trial, by = igc, m = 1) + 
##     s(trial, sbj, bs = "fs", m = 1)
## 
## Model m1 preferred: lower fREML score (31.763), and lower df (4.000).
## -----
##   Model    Score Edf Difference     Df
## 1    m2 17976.23  12                  
## 2    m1 17944.47   8     31.763 -4.000
## 
## AIC difference: -2.53, model m1 has lower AIC.
fm<-m1


# to check the difference in accuracy between the label and ideogram pairings we need to re-level the group factor
levels(data$group)
## [1] "CAT" "PA"
data$group_<-relevel(data$group, ref="PA")
levels(data$group_)
## [1] "PA"  "CAT"
m1_<- bam(acc~ 1 + group_*cnd + s(trial) + s(trial, sbj, bs="fs", m=1), data=data, family=binomial )
## Warning in gam.side(sm, X, tol = .Machine$double.eps^0.5): model has repeated 1-
## d smooths of same variable.
summary(m1_)
## 
## Family: binomial 
## Link function: logit 
## 
## Formula:
## acc ~ 1 + group_ * cnd + s(trial) + s(trial, sbj, bs = "fs", 
##     m = 1)
## 
## Parametric coefficients:
##                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)          3.33837    0.19066  17.509  < 2e-16 ***
## group_CAT           -0.14304    0.25359  -0.564    0.573    
## cndpseudo           -0.08230    0.09248  -0.890    0.374    
## group_CAT:cndpseudo  0.63026    0.13402   4.703 2.57e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##                 edf  Ref.df Chi.sq p-value    
## s(trial)       5.06   5.954  339.3  <2e-16 ***
## s(trial,sbj) 149.60 430.000  757.6  <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.376   Deviance explained = 42.3%
## fREML =  17944  Scale est. = 1         n = 13812
gam.check(m1)
## 
## Method: fREML   Optimizer: perf newton
## full convergence after 4 iterations.
## Gradient range [-3.267317e-09,2.161951e-10]
## (score 17944.47 & scale 1).
## Hessian positive definite, eigenvalue range [1.342041,27.68244].
## Model rank =  445 / 445 
## 
## Basis dimension (k) checking results. Low p-value (k-index<1) may
## indicate that k is too low, especially if edf is close to k'.
## 
##                  k'    edf k-index p-value
## s(trial)       9.00   5.06    1.02    1.00
## s(trial,sbj) 432.00 149.60    1.02    0.99

Graph

par(mfrow=c(1,2), oma = c(0, 0, 2, 0))
offs<-1
color<-c("red", "blue", "red" ,"blue"); colorsmooth<-c("#D0A0A0","#A0A0D0","#D0A0A0","#A0A0D0")
lintyp<-c("solid", "solid", "solid", "solid"); linwid=c(2,2, 2,2);pchar=c(15,17,15,17)

#CAT
#model estimates
plot_smooth(fm, view="trial", cond=list(group="CAT",cnd="pseudo"), rm.ranef=c("s(trial,sbj)"),shade=T,se=1.96,#1.96,#0
            print.summary=F, ylim=c(0,1),transform=inv.logit, xlab="Trial", ylab="Proportion Correct", lwd=2, las=2, rug=FALSE, col=colorsmooth[1], lty=lintyp[1], add=F, hide.label=T, main="Category Learning", yaxs="i",xaxt="n", yaxt="n")
plot_smooth(fm, view="trial", cond=list(group="CAT",cnd="ideo"), rm.ranef=c("s(trial,sbj)"),shade=T, se=1.96,#1.96,#0, 
            print.summary=F,ylim=c(0,1),transform=inv.logit, xlab="Trial", ylab="Proportion Correct",xaxt="n",lwd=2, las=2, rug=FALSE, col=colorsmooth[2], lty=lintyp[2], add=T )
axis(side = 2, at = 0:10/10, labels = c("0.0", 1:9/10.0, "1.0"), las=2, cex.axis = 0.8)
axis(side = 1, at= c(0, 50,100,150,200,250, 288), cex.axis=0.8)
leg<-c("Label Categories", "Ideogram Categories")
legend(x=80, y=0.65, legend=leg, lty=lintyp, bty="n", col=colorsmooth, lwd=linwid, seg.len=2.0)
legend(x=70, y=0.65, legend=c("", ""), bty="n", col=color, pch=pchar)
#Data
plotCI(data_gr_CAT$block*24-12-offs, data_gr_CAT$perf_ps, uiw=data_gr_CAT$perf_ps_se, gap=0, col=color[1], pch=pchar[1],add=T)
plotCI(data_gr_CAT$block*24-12+offs, data_gr_CAT$perf_id, uiw=data_gr_CAT$perf_id_se, gap=0, col=color[2], pch=pchar[2],add=T)


#PA
#model estimates
plot_smooth(fm, view="trial", cond=list(group="PA",cnd="pseudo"), rm.ranef=c("s(trial,sbj)"),shade=T,se=1.96,#1.96,#0
            print.summary=F, ylim=c(0,1),transform=inv.logit, xlab="Trial", ylab="Proportion Correct", lwd=2, las=2, rug=FALSE, col=colorsmooth[3], lty=lintyp[1], add=F, hide.label=T, main="Paired-Associate Learning", yaxs="i", xaxt="n", yaxt="n")
plot_smooth(fm, view="trial", cond=list(group="PA",cnd="ideo"), rm.ranef=c("s(trial,sbj)"),shade=T, se=1.96,#1.96,#0, 
            print.summary=F,ylim=c(0,1),transform=inv.logit, xlab="Trial", ylab="Proportion Correct",xaxt="n",lwd=2, las=2, rug=FALSE, col=colorsmooth[4], lty=lintyp[2], add=T )
axis(side = 2, at = 0:10/10, labels = c("0.0", 1:9/10.0, "1.0"), las=2, cex.axis = 0.8)
axis(side = 1, at= c(0, 50,100,150,200,250, 288), cex.axis=0.8)
leg<-c("Label Pairings", "Ideogram Pairings")
legend(x=80, y=0.65, legend=leg, lty=lintyp, bty="n", col=colorsmooth, lwd=linwid, seg.len=2.0)
legend(x=70, y=0.65, legend=c("", ""), bty="n", col=color, pch=pchar)
#Data
plotCI(data_gr_PA$block*24-12-offs, data_gr_PA$perf_ps, uiw=data_gr_PA$perf_ps_se, gap=0, col=color[3], pch=pchar[3],add=T)
plotCI(data_gr_PA$block*24-12+offs, data_gr_PA$perf_id, uiw=data_gr_PA$perf_id_se, gap=0, col=color[4], pch=pchar[4],add=T)

mtext('Learning Session, Accuracy', outer = TRUE, cex = 1.2, font =2)

par(mfrow=c(1,1))

Session Information

sessionInfo()
## R version 4.0.4 (2021-02-15)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Catalina 10.15.7
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRblas.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] parallel  stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
## [1] dplyr_1.0.5       boot_1.3-26       gplots_3.1.1      sciplot_1.2-0    
## [5] itsadug_2.4       plotfunctions_1.4 mgcv_1.8-33       nlme_3.1-152     
## 
## loaded via a namespace (and not attached):
##  [1] highr_0.8          compiler_4.0.4     pillar_1.5.1       bitops_1.0-7      
##  [5] tools_4.0.4        digest_0.6.27      evaluate_0.14      lifecycle_1.0.0   
##  [9] tibble_3.1.0       lattice_0.20-41    pkgconfig_2.0.3    rlang_0.4.10      
## [13] Matrix_1.3-2       yaml_2.2.1         xfun_0.22          stringr_1.4.0     
## [17] knitr_1.31         generics_0.1.0     vctrs_0.3.6        gtools_3.8.2      
## [21] caTools_1.18.2     tidyselect_1.1.0   grid_4.0.4         glue_1.4.2        
## [25] R6_2.5.0           fansi_0.4.2        rmarkdown_2.7      purrr_0.3.4       
## [29] magrittr_2.0.1     htmltools_0.5.1.1  ellipsis_0.3.1     splines_4.0.4     
## [33] KernSmooth_2.23-18 utf8_1.1.4         stringi_1.5.3      crayon_1.4.1