##BAB 2 #2.1

x <- c(10.4, 5.6, 3.1, 6.4, 21.7)
assign("x", c(10.4, 5.6, 3.1, 6.4, 21.7))
c(10.4, 5.6, 3.1, 6.4, 21.7)
## [1] 10.4  5.6  3.1  6.4 21.7
1/x
## [1] 0.09615385 0.17857143 0.32258065 0.15625000 0.04608295
y <- c(x,0,x)

#2.2 Vectors and assignment

x <- c(1, 2, 3, 4)
y <- c(10, 20, 30, 40)
2*x + y + 1
## [1] 13 25 37 49

Chanpter 2; Simple manipulation; numbers and vectors

sum ((x-mean(x))^2)/(length(x)-1)
## [1] 1.666667
sqrt(-17)
## Warning in sqrt(-17): NaNs produced
## [1] NaN
sqrt(-17+0i)
## [1] 0+4.123106i

#2.3 Generating regular sequences

Opertor Titik dua

1:30
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
## [26] 26 27 28 29 30
30:1
##  [1] 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6
## [26]  5  4  3  2  1

Fungsi seq()

seq(from = -5, to =5, by  = 0.2)
##  [1] -5.0 -4.8 -4.6 -4.4 -4.2 -4.0 -3.8 -3.6 -3.4 -3.2 -3.0 -2.8 -2.6 -2.4 -2.2
## [16] -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2  0.0  0.2  0.4  0.6  0.8
## [31]  1.0  1.2  1.4  1.6  1.8  2.0  2.2  2.4  2.6  2.8  3.0  3.2  3.4  3.6  3.8
## [46]  4.0  4.2  4.4  4.6  4.8  5.0
seq(from = 5, length = 51)
##  [1]  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
## [26] 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
## [51] 55

Fungsi rep()

rep(x, times = 5)
##  [1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
rep(x, each = 5)
##  [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4

#2.4 Logical vectors

x <- c(10, 15, 8, 20)
 x >12
## [1] FALSE  TRUE FALSE  TRUE
z <- c(1, 2, NA, 4, 0/0)

is.na(z)  
## [1] FALSE FALSE  TRUE FALSE  TRUE
is.nan(z)  
## [1] FALSE FALSE FALSE FALSE  TRUE

2,5 Missing Values

Sifat Dasar

x <- c(1, 2, NA, 4)
x + 5
## [1]  6  7 NA  9

cek nilai yang ilang

z <- c(1, 2, NA, 4)
is.na (z)
## [1] FALSE FALSE  TRUE FALSE

Perbedaan NA vs NoN

y <- c(0/0, NA)
is.na(y)   
## [1] TRUE TRUE
is.nan(y) 
## [1]  TRUE FALSE

#2.7 Index vectors; selecting and modifying subsets of a data set

(Logical vector)

y <- x[!is.na(x)]

z <- (x+1)[(!is.na(x)) & (x+1 > 0)]

Vector of positive integers

x[1:6]
## [1]  1  2 NA  4 NA NA
c("x", "y")[rep(c(1, 2), 10)]
##  [1] "x" "y" "x" "y" "x" "y" "x" "y" "x" "y" "x" "y" "x" "y" "x" "y" "x" "y" "x"
## [20] "y"

Vector of negative integers

y <- x[-(1:5)]

Vector of character strings

fruit <- c(5, 10, 1, 20)
names(fruit) <- c("orange", "banana", "apple", "peach")

lunch <- fruit[c("apple", "orange")]

##BAB 3 #3.1 Intrinsic attributes: mode and length

# 1. Memeriksa Mode dan Length
x <- c(10.4, 5.6, 3.1, 6.4, 21.7)
mode(x)
## [1] "numeric"
length(x)
## [1] 5
# 2. Vektor Kosong (Panjang 0, tetapi tetap memiliki mode)
e <- numeric(0)
length(e)
## [1] 0
mode(e)
## [1] "numeric"
# 3. Konversi Otomatis (Implicit Coercion)
# Angka dan karakter digabung dalam satu vektor atomic:
campuran <- c(1, 2, "tiga", 4)
mode(campuran)
## [1] "character"
# 4. Konversi Manual (Explicit Coercion)
z <- 0:9             # Vektor integer dari 0 sampai 9
mode(z)              
## [1] "numeric"
# Mengubah numeric menjadi character
digits <- as.character(z)
digits
##  [1] "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
mode(digits)
## [1] "character"
# Mengubah angka menjadi logical (0 menjadi FALSE, selain 0 menjadi TRUE)
d <- as.logical(z)
d
##  [1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE

#3.2 Changing the length of an object Menambah Panjang Objek secara Otomatis

e <- numeric()

e[3] <- 17
e
## [1] NA NA 17

Memotong Ukuran Objek

alpha <- 1:10   # Vektor berisi 1 sampai 10 (panjang 10)

# Memotong dengan mengambil posisi genap saja (2, 4, 6, 8, 10)
alpha <- alpha[2 * 1:5]
alpha
## [1]  2  4  6  8 10
# Memotong secara langsung menggunakan fungsi length()
length(alpha) <- 3
alpha
## [1] 2 4 6

Perpanjangan Manual Menggunakan

# Memperbesar panjang vektor alpha dari 3 menjadi 6
length(alpha) <- 6
alpha
## [1]  2  4  6 NA NA NA

#3.3 Getting and setting attributes

# 1. Membuat vektor biasa
z <- 1:10

# Memeriksa seluruh atribut 
attributes(z)
## NULL
# 2. Menambahkan atribut dimensi ("dim") menggunakan attr()
attr(z, "dim") <- c(2, 5)

# 3. Memeriksa kembali objek z dan atributnya
# Sekarang R memperlakukan z sebagai matriks 2 baris x 5 kolom
z
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8   10
attributes(z)
## $dim
## [1] 2 5
# Hasil:
# $dim
# [1] 2 5

# 4. Mengambil atribut spesifik
attr(z, "dim")
## [1] 2 5

#3.4 The class of an object

# 1. Mengetahui kelas dari suatu objek
x <- c(10, 20, 30)
class(x)
## [1] "numeric"
# 2. Membuat Data Frame (Objek dengan class khusus "data.frame")
df <- data.frame(id = 1:2, nama = c("A", "B"))
class(df)
## [1] "data.frame"
# 3. Pengaruh Class pada Fungsi Generik seperti summary()
summary(df)
##        id           nama          
##  Min.   :1.00   Length:2          
##  1st Qu.:1.25   Class :character  
##  Median :1.50   Mode  :character  
##  Mean   :1.50                     
##  3rd Qu.:1.75                     
##  Max.   :2.00
# Menampilkan ringkasan berbentuk tabel statistik khusus data frame

# 4. Menggunakan unclass() untuk melihat struktur asli objek
# Mengubah data frame kembali menjadi list biasa
unclass(df)
## $id
## [1] 1 2
## 
## $nama
## [1] "A" "B"
## 
## attr(,"row.names")
## [1] 1 2

##BAB 4 #4.1 A specific example

# 1. Membuat vektor karakter berisi nama negara bagian/wilayah
state <- c("tas", "sa",  "qld", "nsw", "nsw", "nt",  "wa",  "wa",
           "qld", "vic", "nsw", "vic", "qld", "qld", "sa",  "tas",
           "sa",  "nt",  "wa",  "vic", "qld", "nsw", "nsw", "wa",
           "sa",  "act", "nsw", "vic", "vic", "act")

# 2. Mengubah vektor karakter menjadi objek Factor
statef <- factor(state)

# 3. Menampilkan objek factor
statef
##  [1] tas sa  qld nsw nsw nt  wa  wa  qld vic nsw vic qld qld sa  tas sa  nt  wa 
## [20] vic qld nsw nsw wa  sa  act nsw vic vic act
## Levels: act nsw nt qld sa tas vic wa
# 4. Memeriksa atribut levels secara spesifik
levels(statef)
## [1] "act" "nsw" "nt"  "qld" "sa"  "tas" "vic" "wa"

#4.2 The function tapply() and ragged arrays

# 1. Objek Factor kelompok wilayah (statef)
statef <- factor(c("tas", "sa", "qld", "nsw", "nsw", "nt", "wa", "wa",
                   "qld", "vic", "nsw", "vic", "qld", "qld", "sa", "tas",
                   "sa", "nt", "wa", "vic", "qld", "nsw", "nsw", "wa",
                   "sa", "act", "nsw", "vic", "vic", "act"))

# 2. Vektor data pendapatan individual (incomes)
incomes <- c(60, 49, 40, 61, 64, 60, 59, 54, 
             62, 69, 70, 42, 56, 61, 61, 61, 
             58, 51, 48, 65, 49, 49, 41, 48, 
             52, 46, 59, 46, 58, 43)

# 3. Menghitung rata-rata pendapatan untuk setiap wilayah menggunakan tapply()
incmeans <- tapply(incomes, statef, mean)
incmeans
##      act      nsw       nt      qld       sa      tas      vic       wa 
## 44.50000 57.33333 55.50000 53.60000 55.00000 60.50000 56.00000 52.25000
# 4. Menghitung standar deviasi sampel tiap wilayah
incster <- tapply(incomes, statef, sd)
incster
##        act        nsw         nt        qld         sa        tas        vic 
##  2.1213203 10.5577775  6.3639610  9.1815031  5.4772256  0.7071068 11.7260394 
##         wa 
##  5.3150729

#4.3 Ordered factors

# 1. Membuat vektor karakter dengan nilai ordinal
status_pendidikan <- c("SMA", "S1", "SMP", "S2", "SMA", "S1", "SMP")

# 2. Mengubah menjadi Ordered Factor menggunakan fungsi ordered()
# Menentukan urutan hirarki dari yang terendah ke tertinggi via parameter levels
edu_ordered <- ordered(status_pendidikan, levels = c("SMP", "SMA", "S1", "S2"))

# Menampilkan objek ordered factor
edu_ordered
## [1] SMA S1  SMP S2  SMA S1  SMP
## Levels: SMP < SMA < S1 < S2
# 3. Melakukan Perbandingan Antar Elemen
# Memeriksa apakah elemen pertama (SMA) lebih rendah tingkatannya dari elemen kedua (S1)
edu_ordered[1] < edu_ordered[2]
## [1] TRUE
# 4. Cara Alternatif Menggunakan fungsi factor()
edu_ordered2 <- factor(status_pendidikan, 
                       levels = c("SMP", "SMA", "S1", "S2"), 
                       ordered = TRUE)
class(edu_ordered2)
## [1] "ordered" "factor"

##BAB 5 #5.1 Arrays

# 1. Membuat vektor data bernilai 1 sampai 24 (24 elemen)
z <- 1:24

# 2. Mengubah vektor menjadi Array 3-Dimensi (ukuran: 3 baris x 4 kolom x 2 matriks)
dim(z) <- c(3, 4, 2)

# 3. Menampilkan objek array
z
## , , 1
## 
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
## 
## , , 2
## 
##      [,1] [,2] [,3] [,4]
## [1,]   13   16   19   22
## [2,]   14   17   20   23
## [3,]   15   18   21   24
# 4. Memeriksa atribut dimensi secara eksplisit
dim(z)
## [1] 3 4 2

#5.2 Array indexing. Subsections of an array

# 1. Membuat array 3D berukuran (3 baris x 4 kolom x 2 matriks)
a <- array(1:24, dim = c(3, 4, 2))

# 2. Mengakses elemen tunggal pada baris ke-2, kolom ke-4, matriks ke-2
a[2, 4, 2]
## [1] 23
# 3. Mengambil subseksi: Baris ke-2 dari seluruh kolom dan matriks
sub_a <- a[2, , ]
sub_a
##      [,1] [,2]
## [1,]    2   14
## [2,]    5   17
## [3,]    8   20
## [4,]   11   23
# 4. Mengakses menggunakan satu indeks tunggal (Vector-style Indexing)
a[5]
## [1] 5

#5.3 Index matrices

contoh misal ada matriks X berukuran 4 X 5, dan ingin di ekstrak dan diubah nilai pada posisi (1,3), (2,2), dan (3,1):

# 1. Membuat matriks x berukuran 4 baris x 5 kolom
x <- array(1:20, dim = c(4, 5))
x
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    5    9   13   17
## [2,]    2    6   10   14   18
## [3,]    3    7   11   15   19
## [4,]    4    8   12   16   20
# 2. Membuat matriks indeks i (3 baris x 2 kolom)
# Mengacu pada pasangan posisi: (1,3), (2,2), dan (3,1)
i <- array(c(1, 3, 2, 2, 3, 1), dim = c(3, 2))
i
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    3
## [3,]    2    1
# 3. Mengekstrak elemen-elemen spesifik berdasarkan matriks indeks
x[i]
## [1]  5 11  2
# 4. Mengubah nilai pada posisi-posisi spesifik tersebut menjadi 0
x[i] <- 0
x
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    0    9   13   17
## [2,]    0    6   10   14   18
## [3,]    3    7    0   15   19
## [4,]    4    8   12   16   20

#5.4 The array() function

# 1. Membuat matriks x berukuran 4 baris x 5 kolom
x <- array(1:20, dim = c(4, 5))
x
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    5    9   13   17
## [2,]    2    6   10   14   18
## [3,]    3    7   11   15   19
## [4,]    4    8   12   16   20
# 2. Membuat matriks indeks i (3 baris x 2 kolom)
# Mengacu pada pasangan posisi: (1,3), (2,2), dan (3,1)
i <- array(c(1, 3, 2, 2, 3, 1), dim = c(3, 2))
i
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    3
## [3,]    2    1
# 3. Mengekstrak elemen-elemen spesifik berdasarkan matriks indeks
x[i]
## [1]  5 11  2
# Hasil: 9 6 3

# 4. Mengubah nilai pada posisi-posisi spesifik tersebut menjadi 0
x[i] <- 0
x
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    0    9   13   17
## [2,]    0    6   10   14   18
## [3,]    3    7    0   15   19
## [4,]    4    8   12   16   20

#5.4.1 Mixed vector and array arithmetic.

# 1. Membuat Matriks A berukuran 3 baris x 4 kolom (total 12 elemen)
A <- array(1:12, dim = c(3, 4))

# 2. Operasi Campuran: Array + Vektor Skalar (Panjang 1)
# Skalar 5 didaur ulang sebanyak 12 kali
A + 5
##      [,1] [,2] [,3] [,4]
## [1,]    6    9   12   15
## [2,]    7   10   13   16
## [3,]    8   11   14   17
# 3. Operasi Campuran: Array + Vektor Pendek (Panjang 3)
# Vektor v (panjang 3) didaur ulang 4 kali untuk mencukupi 12 elemen matriks A
v <- c(10, 20, 30)
hasil <- A + v
hasil
##      [,1] [,2] [,3] [,4]
## [1,]   11   14   17   20
## [2,]   22   25   28   31
## [3,]   33   36   39   42
# 4. Contoh Kasus Error: Vektor Lebih Panjang dari Array
v_panjang <- 1:15
# A + v_panjang 
# Error: Vektor operand lebih panjang dari array

#5.5 The outer product of two arrays

# 1. Perkalian Luar Dua Vektor Menggunakan Operator %o%
x <- 1:3
y <- 1:4

# Menghasilkan matriks berukuran 3 x 4 (tabel perkalian)
p_luar <- x %o% y
p_luar
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    2    4    6    8
## [3,]    3    6    9   12
# 2. Perkalian Luar Menggunakan Fungsi outer() dengan Operasi Penjumlahan
p_tambah <- outer(x, y, FUN = "+")
p_tambah
##      [,1] [,2] [,3] [,4]
## [1,]    2    3    4    5
## [2,]    3    4    5    6
## [3,]    4    5    6    7
# 3. Menggunakan Fungsi Kustom pada outer()
f <- function(x, y) cos(y) / (1 + x^2)
z <- outer(x, y, f)
z
##            [,1]        [,2]        [,3]        [,4]
## [1,] 0.27015115 -0.20807342 -0.49499625 -0.32682181
## [2,] 0.10806046 -0.08322937 -0.19799850 -0.13072872
## [3,] 0.05403023 -0.04161468 -0.09899925 -0.06536436

#5.6 Generalized transpose of an array

# 1. Kasus Matriks 2D (Sama dengan transpos biasa)
A <- array(1:6, dim = c(2, 3)) # Matriks 2 baris x 3 kolom

# Transpos matriks menggunakan aperm() menukar dimensi 1 dan 2
A_transpos <- aperm(A, c(2, 1)) 
A_transpos
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    5    6
# Membuktikan kesamaan dengan fungsi t()
identical(A_transpos, t(A))
## [1] TRUE
# 2. Kasus Array 3D Multidimensi
# Membuat array 3D berukuran 2 x 3 x 4 (2 baris, 3 kolom, 4 lapisan)
arr <- array(1:24, dim = c(2, 3, 4))

# Menukar posisi dimensi: Dimensi ke-3 jadi ke-1, dimensi ke-1 jadi ke-2, dimensi ke-2 jadi ke-3
arr_perm <- aperm(arr, c(3, 1, 2))

# Memeriksa dimensi baru
dim(arr_perm)
## [1] 4 2 3

#5.7 Matrix facilities

# 1. Membuat Matriks Bujursangkar 2x2
A <- matrix(c(2, 3, 1, 4), nrow = 2, ncol = 2)
A
##      [,1] [,2]
## [1,]    2    1
## [2,]    3    4
# 2. Transpos, Jumlah Baris, dan Jumlah Kolom
t(A)
##      [,1] [,2]
## [1,]    2    3
## [2,]    1    4
nrow(A) 
## [1] 2
ncol(A) 
## [1] 2
# 3. Perkalian Matriks ( Matrix Multiplication %*% )
B <- matrix(c(1, 0, 2, 1), nrow = 2, ncol = 2)
C <- A %*% B
C
##      [,1] [,2]
## [1,]    2    5
## [2,]    3   10
# 4. Invers Matriks dan Determinan
inv_A <- solve(A) # Invers matriks A
inv_A
##      [,1] [,2]
## [1,]  0.8 -0.2
## [2,] -0.6  0.4
det_A <- det(A)   # Determinan matriks A (2*4 - 1*3 = 5)
det_A            
## [1] 5
# 5. Menyelesaikan Sistem Persamaan Linier Ax = b
b <- c(5, 10)
x <- solve(A, b)  # Mencari nilai vektor x
x
## [1] 2 1
# 6. Nilai Eigen dan Vektor Eigen
e <- eigen(A)
e$values   # Nilai Eigen
## [1] 5 1
e$vectors  # Vektor Eigen
##            [,1]       [,2]
## [1,] -0.3162278 -0.7071068
## [2,] -0.9486833  0.7071068

#5.7.1 Matrix multiplication

# 1. Perkalian Elemen-demi-Elemen (*) vs Perkalian Matriks (%*%)
A <- matrix(c(1, 2, 3, 4), nrow = 2)
B <- matrix(c(2, 0, 1, 3), nrow = 2)

# Perkalian elemen-demi-elemen
A * B
##      [,1] [,2]
## [1,]    2    3
## [2,]    0   12
# Perkalian aljabar linier matriks
A %*% B
##      [,1] [,2]
## [1,]    2   10
## [2,]    4   14
# 2. Perkalian Bentuk Kuadratik dengan Vektor (x %*% A %*% x)
x <- c(1, 2)
x %*% A %*% x
##      [,1]
## [1,]   27
# 3. Menggunakan Fungsi crossprod() untuk Efisiensi
crossprod(A, B) # Ekuivalen dengan t(A) %*% B
##      [,1] [,2]
## [1,]    2    7
## [2,]    6   15
# 4. Penggunaan Fungsi diag()
# a. Ekstrak diagonal utama dari matriks A
diag(A)
## [1] 1 4
# b. Buat matriks diagonal dari vektor
diag(c(5, 10, 15))
##      [,1] [,2] [,3]
## [1,]    5    0    0
## [2,]    0   10    0
## [3,]    0    0   15
# c. Buat matriks identitas berukuran 3x3
diag(3)
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    1    0
## [3,]    0    0    1

#5.7.2 Linear equations and inversion

# 1. Membuat Matriks Koefisien A (2x2) dan Vektor Hasil b
A <- matrix(c(2, 1, 1, 3), nrow = 2, ncol = 2)
b <- c(8, 9)

# Matriks A mewakili sistem persamaan:
# 2x1 + 1x2 = 8
# 1x1 + 3x2 = 9

# 2. Menyelesaikan Sistem Persamaan Linier Ax = b
x <- solve(A, b)
x
## [1] 3 2
# Membuktikan kebenaran solusi: A %*% x harus sama dengan b
A %*% x
##      [,1]
## [1,]    8
## [2,]    9
# 3. Mencari Invers Matriks A
A_inv <- solve(A)
A_inv
##      [,1] [,2]
## [1,]  0.6 -0.2
## [2,] -0.2  0.4
# Membuktikan bahwa A %*% A_inv menghasilkan Matriks Identitas
A %*% A_inv
##               [,1] [,2]
## [1,]  1.000000e+00    0
## [2,] -1.110223e-16    1

#5.7.3 Eigenvalues and eigenvectors

# 1. Membuat Matriks Simetris A (2x2)
A <- matrix(c(4, 2, 2, 3), nrow = 2, ncol = 2)
A
##      [,1] [,2]
## [1,]    4    2
## [2,]    2    3
# 2. Menghitung Nilai Eigen dan Vektor Eigen
hasil_eigen <- eigen(A)
hasil_eigen
## eigen() decomposition
## $values
## [1] 5.561553 1.438447
## 
## $vectors
##            [,1]       [,2]
## [1,] -0.7882054  0.6154122
## [2,] -0.6154122 -0.7882054
# 3. Mengakses Nilai Eigen dan Vektor Eigen secara Terpisah
val <- hasil_eigen$values   # Mengambil nilai eigen saja
vec <- hasil_eigen$vectors  # Mengambil matriks vektor eigen

# 4. Menghitung Nilai Eigen Saja (Lebih Cepat)
eigen(A, only.values = TRUE)$values
## [1] 5.561553 1.438447

#5.7.4 Singular value decomposition and determinants

# 1. Membuat Matriks M (2x2)
M <- matrix(c(3, 1, 2, 4), nrow = 2, ncol = 2)
M
##      [,1] [,2]
## [1,]    3    2
## [2,]    1    4
# 2. Melakukan Singular Value Decomposition (SVD)
hasil_svd <- svd(M)
hasil_svd
## $d
## [1] 5.116673 1.954395
## 
## $u
##            [,1]       [,2]
## [1,] -0.6407474 -0.7677517
## [2,] -0.7677517  0.6407474
## 
## $v
##            [,1]       [,2]
## [1,] -0.5257311 -0.8506508
## [2,] -0.8506508  0.5257311
# 3. Rekonstruksi Matriks Asli M = U %*% diag(d) %*% t(V)
U <- hasil_svd$u
D <- diag(hasil_svd$d)
V <- hasil_svd$v

U %*% D %*% t(V)
##      [,1] [,2]
## [1,]    3    2
## [2,]    1    4
# Hasil Output: Persis kembali ke matriks M semula

# 4. Menghitung Nilai Mutlak Determinan
# Menggunakan perkalian nilai singular (prod(svd(M)$d))
prod(hasil_svd$d)
## [1] 10
# Hasil: 10

# Bandingkan dengan nilai mutlak dari fungsi det()
abs(det(M))
## [1] 10
# Hasil: 10

#5.7.5 Least squares fitting and the QR decomposition

# 1. Menyiapkan Data Matriks Prediktor (X) dan Vektor Respon (y)
X <- matrix(c(1, 2, 3, 4, 5, 2, 1, 4, 3, 6), ncol = 2) # Matriks 5x2
y <- c(5, 7, 11, 13, 17)                              # Vektor respon (5 elemen)

# 2. Menggunakan fungsi lsfit() untuk Analisis Regresi
fit <- lsfit(X, y)

# Menampilkan estimasi koefisien (Intercept dan Slope tiap variabel X)
fit$coefficients
## Intercept        X1        X2 
##       1.5       2.5       0.5
# Menampilkan nilai residual
fit$residuals
## [1]  1.271706e-15 -8.988815e-16 -1.644531e-15  8.988815e-16  3.728249e-16
# 3. Menggunakan Dekomposisi QR dengan qr()
qr_X <- qr(X)

# Mengekstrak koefisien regresi secara langsung dari hasil QR
qr.coef(qr_X, y)
## [1] 2.849624 0.556391
# Mengekstrak nilai prediksi (fitted values) dan residual menggunakan fungsi QR
y_hat <- qr.fitted(qr_X, y)
res   <- qr.resid(qr_X, y)

#5.8 Forming partitioned matrices

# 1. Menyiapkan Dua Vektor
x <- c(1, 2, 3)
y <- c(10, 20, 30)

# 2. Menggabungkan Secara Horizontal dengan cbind() (Menjadi Kolom)
m_col <- cbind(x, y)
m_col
##      x  y
## [1,] 1 10
## [2,] 2 20
## [3,] 3 30
# 3. Menggabungkan Secara Vertikal dengan rbind() (Menjadi Baris)
m_row <- rbind(x, y)
m_row
##   [,1] [,2] [,3]
## x    1    2    3
## y   10   20   30
# 4. Menggabungkan Matriks dengan Vektor Tambahan
A <- matrix(1:4, nrow = 2) # Matriks 2x2
v <- c(99, 100)

# Menambahkan vektor v sebagai kolom baru di kanan matriks A
cbind(A, v)
##            v
## [1,] 1 3  99
## [2,] 2 4 100

#5.9 The concatenation function

# 1. Membuat Matriks 2x2
A <- matrix(1:4, nrow = 2, ncol = 2)
A
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
# 2. Menggabungkan Matriks dengan c() (Menjadi Vektor Tunggal)
v_c <- c(A)
v_c
## [1] 1 2 3 4
# 3. Menggabungkan Dua Matriks Menggunakan c()
B <- matrix(5:8, nrow = 2)
gabungan <- c(A, B)
gabungan
## [1] 1 2 3 4 5 6 7 8
# 4. Cara Resmi Mengubah Matriks Kembali Menjadi Vektor (as.vector)
vec_A <- as.vector(A)
is.matrix(vec_A)
## [1] FALSE

#5.10 Frequency tables from factors

# 1. Menyiapkan Dua Faktor
# Faktor 1: Wilayah
wilayah <- factor(c("Jawa", "Sumatra", "Jawa", "Bali", "Jawa", "Sumatra"))

# Faktor 2: Kategori Pendapatan
pendapatan <- factor(c("Tinggi", "Sedang", "Tinggi", "Rendah", "Sedang", "Rendah"))

# 2. Tabel Frekuensi Satu Arah (One-Way)
table(wilayah)
## wilayah
##    Bali    Jawa Sumatra 
##       1       3       2
# 3. Tabel Frekuensi Dua Arah / Tabel Kontingensi (Two-Way)
tab_2arah <- table(pendapatan, wilayah)
tab_2arah
##           wilayah
## pendapatan Bali Jawa Sumatra
##     Rendah    1    0       1
##     Sedang    0    1       1
##     Tinggi    0    2       0
#     Tinggi    0    2       0