Code
knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)Tento dokument ukazuje základné operácie v R so skalármi, textom, logickými hodnotami, vektormi, maticami a vlastnými číslami. Každá časť končí vlastným cvičením.
a <- 12
b <- 4.5
a + b # súčet[1] 16.5
a - b # rozdiel[1] 7.5
a * b # súčin[1] 54
a / b # podiel[1] 2.666667
a ^ 2 # druhá mocnina[1] 144
a %% 5 # zvyšok po delení piatimi[1] 2
a %/% b # celočíselné delenie[1] 2
round(b) # zaokrúhlenie[1] 4
ceiling(b) # nahor[1] 5
floor(b) # nadol[1] 4
round(pi, digits = 3) # zaokrúhlenie na 3 desatinné miesta[1] 3.142
Vypočítajte \(\dfrac{12^2 - 9}{5}\)
(12^2 - 9) / 5[1] 27
meno <- "Livia"
odbor <- "Management"
veta <- paste(meno, "študuje", odbor) # spojenie s medzerou
slitne <- paste0(meno, odbor) # spojenie bez medzery
zoznam <- paste("R", "Python", "SQL", sep = ";")
veta; slitne; zoznam[1] "Livia študuje Management"
[1] "LiviaManagement"
[1] "R;Python;SQL"
nchar(veta) # počet znakov[1] 24
substr(veta, 1, 5) # podreťazec od 1. do 5. znaku[1] "Livia"
toupper(odbor) # veľké písmená[1] "MANAGEMENT"
Z premenných
univerzita <- "Comenius"amesto <- "Bratislava"vytvorte reťazec „Comenius, Bratislava“ a zistite jeho dĺžku a prvé tri znaky.
univerzita <- "Comenius"
mesto <- "Bratislava"
adresa <- paste(univerzita, mesto, sep = ", ")
adresa[1] "Comenius, Bratislava"
nchar(adresa)[1] 20
substr(adresa, 1, 3)[1] "Com"
p <- TRUE
q <- FALSE
!p[1] FALSE
p & q[1] FALSE
p | q[1] TRUE
xor(p, q)[1] TRUE
5 > 3[1] TRUE
10 <= 10[1] TRUE
"R" == "r" # R rozlišuje veľké a malé písmená[1] FALSE
"R" != "Python"[1] TRUE
x <- 15
x > 10 & x < 20[1] TRUE
x < 0 | x > 100[1] FALSE
Zistite, či je číslo
n <- 42párne a zároveň väčšie ako 40.
n <- 42
(n %% 2 == 0) & (n > 40)[1] TRUE
v1 <- c(3, 6, 9, 12)
v2 <- 10:15
v3 <- seq(from = 0, to = 2, by = 0.5)
v4 <- rep(7, times = 4)
set.seed(2026) # kvôli reprodukovateľnosti
v5 <- round(runif(5), 3) # rovnomerné rozdelenie
v6 <- round(rnorm(5), 3) # normálne rozdelenie
v1; v2; v3; v4; v5; v6[1] 3 6 9 12
[1] 10 11 12 13 14 15
[1] 0.0 0.5 1.0 1.5 2.0
[1] 7 7 7 7
[1] 0.699 0.557 0.140 0.286 0.555
[1] -1.958 1.085 0.204 0.501 1.030
v <- c(2, 4, 6, 8)
v + 1[1] 3 5 7 9
v * 3[1] 6 12 18 24
v^2[1] 4 16 36 64
sqrt(v)[1] 1.414214 2.000000 2.449490 2.828427
sum(c(1, 2, 3) * c(4, 5, 6)) # skalárny súčin[1] 32
crossprod(c(1, 2, 3), c(4, 5, 6)) # skalárny súčin ako matica 1x1 [,1]
[1,] 32
c(1, 2, 3) * c(4, 5, 6) # súčin po prvkoch[1] 4 10 18
x <- c(8, 15, 2, 21, 6, 0, 30)
x[1][1] 8
x[3:5][1] 2 21 6
x[-1][1] 15 2 21 6 0 30
x[x > 10][1] 15 21 30
which(x > 10)[1] 2 4 7
y <- c(4, NA, 8, NA, 12)
is.na(y)[1] FALSE TRUE FALSE TRUE FALSE
mean(y)[1] NA
mean(y, na.rm = TRUE)[1] 8
z <- c(14, 7, 9, 3, 11)
mean(z)[1] 8.8
sd(z)[1] 4.147288
max(z)[1] 14
summary(z) Min. 1st Qu. Median Mean 3rd Qu. Max.
3.0 7.0 9.0 8.8 11.0 14.0
sort(z)[1] 3 7 9 11 14
sort(z, decreasing = TRUE)[1] 14 11 9 7 3
Vytvorte vektor
ws číslami 1 až 30 a vypočítajte súčet čísel deliteľných tromi. Potom určte ich počet.
w <- 1:30
del3 <- w[w %% 3 == 0]
del3 [1] 3 6 9 12 15 18 21 24 27 30
sum(del3) # 165[1] 165
length(del3) # 10[1] 10
m <- matrix(1:12, nrow = 3, ncol = 4) # po stĺpcoch
m_byrow <- matrix(1:12, nrow = 3, byrow = TRUE) # po riadkoch
m; m_byrow [,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
dim(m)[1] 3 4
m[1, 2][1] 4
m[, 3][1] 7 8 9
m[2, ][1] 2 5 8 11
m[1:2, 2:3] [,1] [,2]
[1,] 4 7
[2,] 5 8
A <- matrix(c(2, 0, 1, 3), nrow = 2)
B <- matrix(c(1, 4, 2, 5), nrow = 2)
A + B [,1] [,2]
[1,] 3 3
[2,] 4 8
A * B # po prvkoch [,1] [,2]
[1,] 2 2
[2,] 0 15
A %*% B # maticový súčin [,1] [,2]
[1,] 6 9
[2,] 12 15
t(A) # transpozícia [,1] [,2]
[1,] 2 0
[2,] 1 3
det(A) # determinant[1] 6
solve(A) # inverzia [,1] [,2]
[1,] 0.5 -0.1666667
[2,] 0.0 0.3333333
C <- cbind(1:3, 7:9)
D <- rbind(1:3, 7:9)
C; D [,1] [,2]
[1,] 1 7
[2,] 2 8
[3,] 3 9
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 7 8 9
M <- matrix(1:9, nrow = 3)
apply(M, 1, sum) # súčty po riadkoch[1] 12 15 18
apply(M, 2, mean) # priemery po stĺpcoch[1] 2 5 8
Vytvorte maticu 4x4 s hodnotami 1..16 po riadkoch, vypočítajte riadkové súčty a súčin \(M^T M\).
M2 <- matrix(1:16, nrow = 4, byrow = TRUE)
M2 [,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
[4,] 13 14 15 16
rowSums(M2)[1] 10 26 42 58
t(M2) %*% M2 [,1] [,2] [,3] [,4]
[1,] 276 304 332 360
[2,] 304 336 368 400
[3,] 332 368 404 440
[4,] 360 400 440 480
Pre štvorcovú maticu \(\mathbf A\) platí
\[ \mathbf A \mathbf v = \lambda \mathbf v , \]
kde \(\lambda\) je vlastné číslo a \(\mathbf v \neq \mathbf 0\) je príslušný vlastný vektor.
\[ \mathbf A = \begin{pmatrix} 3 & 1 \\ 1 & 3 \end{pmatrix} \]
Charakteristická rovnica:
\[ \det(\mathbf A - \lambda \mathbf I) = (3-\lambda)^2 - 1 = \lambda^2 - 6\lambda + 8 = (\lambda - 4)(\lambda - 2) = 0 , \]
teda \(\lambda_1 = 4\), \(\lambda_2 = 2\).
Pre \(\lambda_1 = 4\) dostaneme sústavu \(-h_{11} + h_{21} = 0\), teda \(h_{11} = h_{21}\). Po normalizácii
\[ \mathbf h_1 = \begin{pmatrix} \sqrt{1/2} \\ \sqrt{1/2} \end{pmatrix}. \]
Pre \(\lambda_2 = 2\) dostaneme \(h_{12} + h_{22} = 0\), teda \(h_{22} = -h_{12}\) a
\[ \mathbf h_2 = \begin{pmatrix} \sqrt{1/2} \\ -\sqrt{1/2} \end{pmatrix}. \]
Matica je symetrická, preto \(\mathbf h_1^T \mathbf h_2 = \tfrac12 - \tfrac12 = 0\) (vektory sú navzájom kolmé).
eigen()A_eig <- matrix(c(3, 1,
1, 3), nrow = 2, byrow = TRUE)
eig_A <- eigen(A_eig, symmetric = TRUE)
lambda_A <- eig_A$values # vlastné čísla
V_A <- eig_A$vectors # vlastné vektory v stĺpcoch
lambda_A[1] 4 2
V_A [,1] [,2]
[1,] 0.7071068 -0.7071068
[2,] 0.7071068 0.7071068
Vektory \(\mathbf v\) aj \(-\mathbf v\) sú rovnako správne, preto sa výsledok z R môže líšiť od ručného znamienkom.
lambda_1 <- lambda_A[1]
v_1 <- V_A[, 1]
lava <- as.vector(A_eig %*% v_1)
prava <- lambda_1 * v_1
lava[1] 2.828427 2.828427
prava[1] 2.828427 2.828427
all.equal(lava, prava)[1] TRUE
local({
povodne <- par(mfrow = c(1, 2), mar = c(4, 4, 3, 1))
on.exit(par(povodne))
priklady <- list(c(1, 1), c(1, -1))
nazvy <- c("Vlastný vektor: lambda = 4", "Vlastný vektor: lambda = 2")
for (j in seq_along(priklady)) {
x <- priklady[[j]]
Ax <- as.vector(A_eig %*% x)
plot(NA, xlim = c(-2, 5), ylim = c(-2, 5), asp = 1,
xlab = "Prvá súradnica", ylab = "Druhá súradnica",
main = nazvy[j], cex.main = 0.85)
abline(h = 0, v = 0, col = "grey80")
arrows(0, 0, Ax[1], Ax[2], col = "darkorange2", lwd = 4, length = 0.12)
arrows(0, 0, x[1], x[2], col = "steelblue4", lwd = 2, lty = 2, length = 0.10)
legend("topleft", legend = c("x", "Ax"),
col = c("steelblue4", "darkorange2"),
lty = c(2, 1), lwd = c(2, 4), bty = "n", cex = 0.8)
}
})Súčet vlastných čísel sa rovná stope matice a súčin determinantu.
c(sucet_vlastnych = sum(lambda_A), stopa = sum(diag(A_eig)))sucet_vlastnych stopa
6 6
c(sucin_vlastnych = prod(lambda_A), determinant = det(A_eig))sucin_vlastnych determinant
8 8
Pre variančno-kovariančnú maticu denných výnosov troch aktív (ilustračné hodnoty) vypočítajte vlastné čísla a vlastné vektory a určte, aký podiel celkového rozptylu vysvetľuje prvá hlavná zložka.
| Asset | KO | GLD | QQQ |
|---|---|---|---|
| KO | 0.000090 |
0.000012 |
0.000070 |
| GLD | 0.000012 |
0.000040 |
0.000015 |
| QQQ | 0.000070 |
0.000015 |
0.000250 |
Sigma <- matrix(c(
0.000090, 0.000012, 0.000070,
0.000012, 0.000040, 0.000015,
0.000070, 0.000015, 0.000250
), nrow = 3, byrow = TRUE,
dimnames = list(c("KO", "GLD", "QQQ"), c("KO", "GLD", "QQQ")))
eig_S <- eigen(Sigma, symmetric = TRUE)
eig_S$values[1] 2.777055e-04 6.503220e-05 3.726232e-05
eig_S$vectors [,1] [,2] [,3]
[1,] -0.35268848 0.9066881 0.231360283
[2,] -0.07665452 0.2184226 -0.972838973
[3,] -0.93259580 -0.3608439 -0.007533387
# kontrola: všetky vlastné čísla > 0 => matica je pozitívne definitná
all(eig_S$values > 0)[1] TRUE
# kontrola stopy: súčet vlastných čísel = súčet rozptylov
c(sum(eig_S$values), sum(diag(Sigma)))[1] 0.00038 0.00038
# podiel rozptylu vysvetlený jednotlivými hlavnými zložkami
podiel <- eig_S$values / sum(eig_S$values)
round(podiel, 3)[1] 0.731 0.171 0.098
round(cumsum(podiel), 3)[1] 0.731 0.902 1.000
Interpretácia: ak má prvé vlastné číslo veľký podiel, väčšina pohybu aktív je spoločná (trhový faktor), a prvý vlastný vektor ukazuje, ako sa jednotlivé aktíva na ňom podieľajú.