Dalam statistik, kita sering ingin melakukan resampling untuk menguji keakuratan estimasi sampel kita. Ini disebut bootstrapping—sebuah tes yang didasarkan pada pengambilan sampel acak berulang denganpengembalian (replacement). Dalam pembelajaran kali ini, kita akan: (1) menghasilkan 1000 sampel acak baru dari sebuah vektor (dengan pengembalian), (2) menghitung estimasi tertentu (misalnya, mean, median, dll.) untuk setiap sampel tersebut, dan(3) menghitung standar deviasi dari distribusi estimasi tersebut.
Kita akan membuat sebuah vektor berisi angka yang terdistribusi secara normal dengan nama myData.
Fungsi rnorm() memungkinkan kita untuk menghasilkan urutan angka acak dari distribusi normal hipotetisdengan rata-rata (mean) 20 dan standar deviasi 4.5. Di sini, kita memilih untuk menghasilkan 2000 observasi.
set.seed(300) # Setting the seed for replication purposes
myData <- rnorm(2000,20,4.5) # Creating a random normal distribution (n=300, mean=20, sd=4.5)
Penjelasan: - set.seed(300) digunakan untuk menetapkan seed (angka acak) agar hasil yang dihasilkan oleh fungsi acak(seperti rnorm) dapat direplikasi. Ini memastikan bahwa setiap kali kode dijalankan, hasilnya akan sama.- rnorm(2000, 20, 4.5) menghasilkan 2000 observasi dari distribusi normal dengan mean 20 dan standardeviasi 4.5. Hasilnya disimpan dalam vektor myData.
Untuk memastikan bahwa vektor myData telah dibuat dengan benar, kita memverifikasi bahwa: 1. Terdapat 2000 observasi (menggunakan length()), 2. Nilai rata-rata (mean) mendekati 20 (menggunakan mean()), dan 3. Standar deviasi mendekati 4.5 (menggunakan sd()). Catatan: Kita tidak seharusnya mengharapkan mean dan standar deviasi memiliki nilai yang persis samadengan yang kita masukkan ke dalam rnorm(), karena ada unsur acak yang terlibat saat menggunakan fungsiini (rnorm menghasilkan distribusi normal acak di sekitar mean dan standar deviasi yang diberikan).
length(myData) # How many observations?
## [1] 2000
length(myData) menghitung jumlah observasi dalam vektor myData. Harusnya menghasilkan 2000 karena kitamembuat 2000 observasi.
mean(myData) # What is the mean?
## [1] 20.25773
mean(myData) menghitung rata-rata dari vektor myData. Harusnya mendekati 20 karena kita menetapkanmean = 20 saat membuat data
sd(myData) # What is the standard deviation?
## [1] 4.590852
sd(myData) menghitung standar deviasi dari vektor myData. Harusnya mendekati 4.5 karena kita menetapkanstandar deviasi = 4.5 saat membuat data.
Untuk tujuan visual, berikut adalah grafik dari vektor myData. Garis putus-putus merah menunjukkan nilai mean (20.25773) dari distribusi ini.
# Membuat histogram dari myData
hist(myData, breaks = 30, col = "Pink", main = "Distribusi myData", xlab = "Nilai", ylab = "Frekuensi")
# Menambahkan garis vertikal untuk mean
abline(v = mean(myData), col = "red", lwd = 2, lty = 2)
# Menambahkan legenda
legend("topright", legend = paste("Mean =", round(mean(myData), 5)), col = "red", lty = 2, lwd = 2)
Penjelasan: 1. hist() digunakan untuk membuat histogram dari myData.
breaks = 30 menentukan jumlah bin (kelompok) pada histogram. col =
“Pink” memberikan warna biru muda pada histogram. main, xlab, dan ylab
masing-masing digunakan untuk judul grafik, label sumbu x, dan label
sumbu y.2. abline() menambahkan garis vertikal pada nilai mean. v =
mean(myData) menentukan posisi garis pada nilai mean. col = “red”
memberikan warna merah pada garis. lwd = 2 menentukan ketebalan garis.
lty = 2 membuat garis menjadi putus-putus. 3. legend() menambahkan
legenda ke grafik untuk menjelaskan garis merah. Output dari kode ini
adalah histogram yang menunjukkan distribusi myData dengan garis merah
putusputus yang menandakan nilai mean.
Apa itu bootstrapping? Bootstrapping adalah metode untuk memperhitungkan ketidakpastian saat kitamengukur estimasi sampel. Dengan menggunakan pengambilan sampel acak dengan pengembalian (randomsampling with replacement), kita menghitung estimasi kita untuk berbagai sampel acak yang diambil dari distribusi asli kita. Analogi dengan “Mean of Means” pada Dadu Perhatikan kejadian saat menghitung “rata-rata dari rata-rata”(mean of means) untuk lemparan dadu, kita memperkirakan seberapa besar kemungkinan kita akanmengamati estimasi sampel tertentu (misalnya, mean, standar deviasi). Jika kita mengambil sampel ulangsecara acak dari distribusi dasar ini dengan penggantian sejumlah besar kali. Alasan kita mengambil sampelulang dengan penggantian adalah untuk memungkinkan angka-angka tertentu dipilih beberapa kali, yangmenciptakan varians yang lebih besar dalam distribusi yang dihasilkan. Mengapa Menggunakan Pengembalian (Replacement)? Alasan kita menggunakan pengembalian adalahuntuk memungkinkan angka tertentu dipilih lebih dari satu kali, yang menciptakan variasi yang lebih besardalam distribusi yang dihasilkan. Langkah-langkah Bootstrapping: 1. Ambil sampel acak dengan pengembalian dari distribusi asli. 2. Hitung estimasi (misalnya, mean, median, standar deviasi) untuk sampel tersebut. 3. Ulangi proses ini berkali-kali (misalnya, 1000 kali) untuk menghasilkan distribusi estimasi. 4. Analisis distribusi estimasi ini untuk memahami variabilitas dan ketidakpastian dari estimasi sampel.
Secara sederhana, yang kita lakukan di sini adalah menghitung mean dari 1000 sampel yang masing-masingterdiri dari 2000 observasi dari myData menggunakan perulangan for(i in x). Mean dari setiap sampel ini disimpan dalam sebuah vektor (bootstrap.results). Tujuan: Kita tertarik untuk mengukur ketidakpastian dalam distribusi estimasi kita (dalam hal ini, mean). Untukmelakukannya, kita menghitung standar deviasi dari setiap mean yang dihitung menggunakan pengambilansampel acak dengan pengembalian (random sampling with replacement).
set.seed(200) # Menetapkan seed untuk replikasi
sample.size <- 2000 # Ukuran sampel
n.samples <- 1000 # Jumlah bootstrap sample
# Pastikan myData sudah terdefinisi sebelumnya
# Contoh: myData <- rnorm(sample.size) # Jika myData belum ada, gunakan data contoh
bootstrap.results <- numeric(n.samples) # Membuat vektor kosong dengan ukuran tetap
for (i in 1:n.samples) {
obs <- sample(1:sample.size, replace = TRUE) # Mengambil sampel acak dengan pengembalian
bootstrap.results[i] <- mean(myData[obs]) # Menghitung mean dari sampel
}
# Menampilkan ringkasan hasil bootstrap
summary(bootstrap.results)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 19.92 20.19 20.26 20.26 20.33 20.57
Penjelasan: - set.seed(200) menetapkan seed untuk replikasi. - sample.size <- 2000 menentukan ukuran sampel (sama dengan jumlah observasi dalam myData).n.samples <- 1000 menentukan jumlah sampel bootstrap yang akan diambil. - bootstrap.results <- c() membuat vektor kosong untuk menyimpan hasil bootstrap. - for (i in 1:n.samples) melakukan perulangan sebanyak 1000 kali. - obs <- sample(1:sample.size, replace=TRUE) mengambil sampel acak dengan pengembalian dari indeks 1 hingga 2000. - bootstrap.results[i] <- mean(myData[obs]) menghitung mean dari sampel yang diambil danmenyimpannya dalam vektor bootstrap.results.
length(bootstrap.results) # Sanity check: this should contain the mean of 1000 different samples
## [1] 1000
length(bootstrap.results) memeriksa panjang vektor bootstrap.results. Harusnya 1000 karena kita mengambil1000 sampel.
summary(bootstrap.results) # Sanity check
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 19.92 20.19 20.26 20.26 20.33 20.57
summary(bootstrap.results) memberikan ringkasan statistik dari vektor bootstrap.results, termasuk min, max,mean, dan kuartil.
sd(bootstrap.results) # Checking the standard deviation of the distribution of means (this is what we are interested in!)
## [1] 0.1021229
sd(bootstrap.results) menghitung standar deviasi dari distribusi mean yang dihasilkan oleh bootstrapping.
par(mfrow = c(2,1), mar = c(4, 4, 2, 1)) # Adjust margins for better layout
# Histogram for bootstrap results
hist(bootstrap.results,
col = "#d83737", # Changing the color
xlab = "Mean", # Label for the x-axis
main = "Means of 1000 bootstrap samples from myData") # Title for the graph
# Histogram for myData
hist(myData,
col = "#37aad8", # Changing the color
xlab = "Value", # Label for the x-axis
main = "Distribution of myData") # Title for the graph
Penjelasan: - par(mfrow=c(2,1), pin=c(5.8,0.98)) mengatur tata
letak plot menjadi 2 baris dan 1 kolom, sertamenentukan ukuran plot. -
hist(bootstrap.results, col=“#d83737”, xlab=“Mean”, main=paste(“Means of
1000 bootstrap samples frommyData”)) membuat histogram dari distribusi
mean hasil bootstrapping. - hist(myData, col=“#37aad8”, xlab=“Value”,
main=paste(“Distribution of myData”)) membuat histogramdari data asli
myData.
Demikian pula, kita juga dapat mengambil 1000 sampel acak dari proses pembuatan data asli.
set.seed(200) # Setting the seed for replication
sample.size <- 2000 # Sample size
n.samples <- 1000 # Number of bootstrap samples
bootstrap.results <- numeric(n.samples) # Initialize an empty numeric vector
for (i in 1:n.samples) {
bootstrap.results[i] <- mean(rnorm(sample.size, 20, 4.5)) # Mean of bootstrap sample
}
Penjelasan: - set.seed(200) digunakan untuk menetapkan seed agar hasil yang dihasilkan dapat direplikasi. Ini memastikan bahwa setiap kali kode dijalankan, hasilnya akan sama. - sample.size <- 2000 menentukan ukuran sampel yang akan dihasilkan setiap kali (dalam hal ini, 2000observasi). - n.samples <- 1000 menentukan jumlah sampel bootstrap yang akan diambil (dalam hal ini, 1000sampel). - bootstrap.results <- c() membuat vektor kosong untuk menyimpan hasil bootstrap (yaitu mean dari setiapsampel). - for (i in 1:n.samples) melakukan perulangan sebanyak 1000 kali. - Di dalam perulangan, rnorm(2000, 20, 4.5) menghasilkan 2000 observasi dari distribusi normaldengan mean 20 dan standar deviasi 4.5. - mean(rnorm(2000, 20, 4.5)) menghitung mean dari sampel yang baru saja dihasilkan. - bootstrap.results[i] menyimpan mean tersebut ke dalam vektor bootstrap.results.
length(bootstrap.results) # Sanity check: this should contain the mean of 1000 different samples
## [1] 1000
length(bootstrap.results) memeriksa panjang vektor bootstrap.results. Harusnya menghasilkan 1000 karenakita mengambil 1000 sampel bootstrap.
summary(bootstrap.results) # Sanity check
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 19.64 19.93 20.00 20.00 20.07 20.32
summary(bootstrap.results) memberikan ringkasan statistik dari vektor bootstrap.results, termasuk nilai minimum, kuartil pertama (Q1), median (Q2), mean, kuartil ketiga (Q3), dan nilai maksimum. Ini membantu kitamemahami distribusi dari mean yang dihasilkan oleh bootstrapping.
sd(bootstrap.results) # Checking
## [1] 0.1041927
sd(bootstrap.results) menghitung standar deviasi dari distribusi mean yang dihasilkan oleh bootstrapping.Standar deviasi ini mengukur variabilitas atau ketidakpastian dari estimasi mean yang kita peroleh melalui bootstrapping.
par(mfrow = c(2,1), mar = c(4, 4, 2, 1)) # Set layout (2 rows, 1 column) and adjust margins
# Histogram for bootstrap results
hist(bootstrap.results,
col = "#d83737", # Set color
xlab = "Mean", # Label for x-axis
main = "Means of 1000 bootstrap samples from the DGP") # Title for the graph
# Ensure myData is defined before using it
if (exists("myData")) {
hist(myData,
col = "#37aad8", # Set color
xlab = "Value", # Label for x-axis
main = "Distribution of myData") # Title for the graph
} else {
warning("myData is not defined. Please assign a value to myData before running this code.")
}
Penjelasan: - par(mfrow=c(2,1), pin=c(5.8,0.98)) mengatur tata
letak plot menjadi 2 baris dan 1 kolom, sertamenentukan ukuran plot. -
hist(bootstrap.results, col=“#d83737”, xlab=“Mean”, main=paste(“Means of
1000 bootstrap samples fromthe DGP”)) membuat histogram dari distribusi
mean hasil bootstrapping. - col=“#d83737” memberikan warna merah pada
histogram. - xlab=“Mean” memberikan label “Mean” pada sumbu x. -
main=paste(“Means of 1000 bootstrap samples from the DGP”) memberikan
judul grafik. - hist(myData, col=“#37aad8”, xlab=“Value”,
main=paste(“Distribution of myData”)) membuat histogramdari data asli
myData. - col=“#37aad8” memberikan warna biru pada histogram. -
xlab=“Value” memberikan label “Value” pada sumbu x. -
main=paste(“Distribution of myData”) memberikan judul grafik.
Latihan 1 Tetapkan benih Anda pada angka 150. Hasilkan distribusi normal acak dari 1000 observasi, dengan rata-rata30 dan simpangan baku 2,5. Hitung rata-rata dari 50 sampel dari 1000 observasi dari kumpulan data tersebut.Simpan hasil Anda dalam vektor. Fungsi yang relevan: set.seed(), rnorm(), for(i in x), sample().
set.seed(150) # Tetapkan seed untuk replikasi
data <- rnorm(1000, mean = 30, sd = 2.5) # Buat distribusi normal acak dengan 1000 observasi
sample_means <- numeric(50) # Buat vektor kosong untuk menyimpan rata-rata sampel
for (i in 1:50) {
samp <- sample(data, size = 50, replace = TRUE) # Ambil sampel acak dari 1000 observasi
sample_means[i] <- mean(samp) # Simpan rata-rata sampel
}
# Menampilkan ringkasan hasil
summary(sample_means)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 29.03 29.66 29.86 29.89 30.14 30.61
kesimpulan : Pada Latihan 1, kita mengambil 50 sampel acak dari data yang sudah dibuat dengan rata-rata 30 dan simpangan baku 2.5. Hasilnya menunjukkan bahwa rata-rata dari sampel yang diambil berkisar antara 29.03 hingga 30.46, dengan nilai tengah 29.86, yang sangat mendekati rata-rata asli. Ini berarti metode pengambilan sampel secara acak sudah cukup baik untuk memperkirakan rata-rata populasi. Dengan kata lain, semakin banyak sampel yang kita ambil, semakin akurat perkiraan kita terhadap rata-rata sebenarnya.
Latihan 2 Hasilkan dua histogram untuk menampilkan secara grafis distribusi rata-rata yang diperoleh dalam Latihan 1serta nilai dari 1000 observasi dalam kumpulan data asli Anda. Gabungkan histogram ini menjadi satu grafikkeseluruhan. Fungsi yang relevan: par(), hist()
par(mfrow = c(2,1), mar = c(4, 4, 2, 1)) # Mengatur tata letak 2 baris, 1 kolom & menyesuaikan margin
# Histogram dari rata-rata sampel (50 sampel)
hist(sample_means,
col = "#d83737", # Warna merah
xlab = "Mean Value",
main = "Histogram of Sample Means (50 Samples)")
# Histogram dari distribusi asli (1000 observasi)
hist(data,
col = "#37aad8", # Warna biru
xlab = "Value",
main = "Histogram of Original Data (1000 Observations)")
Dari hasil latihan ini, kita bisa melihat bahwa rata-rata dari sampel
yang diambil memiliki variasi yang lebih kecil dibandingkan dengan data
aslinya. Artinya, jika kita mengambil banyak sampel dan menghitung
rata-ratanya, hasilnya cenderung lebih stabil dibandingkan nilai-nilai
individu dalam data asli. Selain itu, distribusi rata-rata sampel
membentuk pola yang lebih mendekati kurva normal, sesuai dengan teori
statistik yang menyebutkan bahwa jika kita mengambil cukup banyak
sampel, distribusi rata-ratanya akan mendekati distribusi normal.