Uporaba funkcije apply

Z apply lahko uporabimo neko funkcijo na stolpcih ali pa vrsticah matrike.

Priprava parametrov

N <- 100
n <- 9
mu <- 0
sd <- 1

Generirajmo podatke in jih uredimo v matriko

set.seed(1906)
A <- matrix(rnorm(N*n,mu,sd),N,n)
head(A)
##            [,1]       [,2]        [,3]       [,4]       [,5]      [,6]
## [1,] -0.7044098 -0.8110516 -1.58470687  0.3001331 -0.7964532 0.7571276
## [2,] -0.9699711  0.8481990 -1.86274821  0.6143037 -0.3124682 0.5371143
## [3,] -1.0441666 -0.8428976  1.15351674 -0.5070130 -0.3399565 0.4132697
## [4,] -0.5345256 -1.0147145 -0.06120336  0.5350865 -0.5440536 2.1957062
## [5,]  2.5216664 -1.5671690  1.78686949 -0.2030307 -1.0809696 2.7777414
## [6,]  1.1920201  0.7603192 -0.18927284  0.2734290  0.1435751 1.2987961
##            [,7]       [,8]       [,9]
## [1,] -0.7961387 -0.9682794 -0.1884405
## [2,]  2.6095385 -0.4393865  0.9564861
## [3,] -1.4735579  0.4019704 -0.4927346
## [4,] -0.5135447  0.2706867 -0.1494888
## [5,]  0.1072300  1.0677550 -1.1076928
## [6,]  0.8703519 -0.5011438  0.4904350
tail(A)
##              [,1]       [,2]       [,3]       [,4]        [,5]       [,6]
## [95,]   2.0713827 -0.1294242 -1.3504702 -0.1447354  2.20657884  0.7865765
## [96,]  -0.1903930 -0.7060253  0.7420465  0.6165230 -0.49364086 -0.6483914
## [97,]  -1.1249320 -0.1964624  1.2847127  0.8495554 -1.70126296  0.5519242
## [98,]  -0.5903283  0.5270605  0.5474000  1.1475843 -2.09731272 -1.5295264
## [99,]   0.5144857  1.3288942  0.6845989 -0.4561285  0.06217497 -1.0847695
## [100,] -1.3890024  0.5532841  0.2353348 -0.5037092  0.75252262 -0.1516535
##               [,7]        [,8]       [,9]
## [95,]   0.42719673  0.76591990  0.3762210
## [96,]   0.08452309  0.73628088 -1.2246322
## [97,]  -0.44623991  0.06411625  0.7661967
## [98,]  -1.40247442 -0.74222145  0.5524084
## [99,]   0.01003906  0.34056834 -0.1328869
## [100,]  0.55542504 -0.33283435  0.6848333

Izračun povprečij

head(apply(A,1,mean))
## [1] -0.53246882  0.22011860 -0.30350772  0.02043876  0.47804447  0.48205664
head(apply(A,1,sd))
## [1] 0.7087099 1.2930178 0.8232158 0.9406204 1.6299973 0.6097998

Risanje profilov

plot(A[1,],ylim=range(A),type="n",axes=FALSE,ylab="Vrednost")
axis(2)
axis(1,at=1:n)
box()
apply(A,1,lines)

## NULL
plot(A[1,],ylim=range(A),type="n",axes=FALSE,ylab="Vrednost")
axis(2)
axis(1,at=1:n)
box()
apply(A,1,lines,type="b")

## NULL
plot(A[1,],ylim=range(A),type="n",axes=FALSE,ylab="Vrednost")
axis(2)
axis(1,at=1:n)
box()
for( i in 1:N) lines(A[i,],col=i)

Funkcija za interval zaupanja

ci <- function(x,conf=0.95){
  n <- length(x)
  xbar <- mean(x)
  s <- sd(x)
  alpha <- 1-conf
  t <- qt(c(alpha/2, 1-alpha/2),n-1)
  meje <- xbar+t*s/sqrt(n)
# if(interactive()) print(c(n,xbar,s,t))
  return(meje)
}
ci(rnorm(9))
## [1] -0.868824  0.499713
ciLimits <- apply(A,1,ci)
head(t(ciLimits))
##             [,1]       [,2]
## [1,] -1.07723148 0.01229384
## [2,] -0.77378289 1.21402009
## [3,] -0.93628737 0.32927194
## [4,] -0.70258605 0.74346356
## [5,] -0.77488240 1.73097133
## [6,]  0.01332301 0.95079028
plot(ciLimits,type="n",ylim=range(ciLimits),
     xlim=c(1,N),xlab="Vzorec",ylab="Vrednost")

abline(h=0,lwd=5,col=rgb(1,0,1,0.25))
#abline(h=-2:2,col=8)
segments(1:N,ciLimits[1,],1:N,ciLimits[2,],lwd=1)

Poiščimo intervale, ki NE vsebujeo prave vrednosti \(\mu = 0\)

out <- apply(ciLimits,2,prod)
head(out)
## [1] -0.01324331 -0.93938798 -0.30829316 -0.52234713 -1.34129922  0.01266738
out <- apply(ciLimits,2,prod)>0
head(out)
## [1] FALSE FALSE FALSE FALSE FALSE  TRUE
which(out)
## [1]  6 11 18 58 84 86 88
nOut <- sum(out)
barva <- out+1
head(barva)
## [1] 1 1 1 1 1 2

Naredimo barvast graf

plot(ciLimits,type="n",ylim=range(ciLimits),
     xlim=c(1,N),xlab="Vzorec",ylab="Vrednost")

abline(h=0,lwd=1,col=rgb(1,0,1,0.25))
#abline(h=-2:2,col=8)
segments(1:N,ciLimits[1,],1:N,ciLimits[2,],
         lwd=barva,
         col=barva)

V našem primeru 7 od 100 ( ali 7% ) intervalov ne vsebuje prave vrednosti.