Chi-squared

> # Generate 5 standard normal variates
> set.seed(2024)
> x1 <- rnorm(1000)
> x2 <- rnorm(1000)
> x3 <- rnorm(1000)
> x4 <- rnorm(1000)
> x5 <- rnorm(1000)
> 
> # Square the values to create chi-square distributed data of 5 degrees of freedom
> x_sq <- x1^2 + x2^2 + x3^2 + x4^2 + x5^2
> 
> # Plotting the chi-square distribution
> hist(x_sq, breaks = 20, freq = FALSE, 
+      main = "Chi-Square Distribution (df=5)", 
+      xlab = "Value", ylab = "Density", col = "skyblue", border = "white")
> curve(dchisq(x, df = 5), add = TRUE, col = "red", lwd = 2, lty = 2)
> legend("topright", legend = "Chi-Square Density", col = "red", lty = 2, bty = "n")

> # Generate chi-square distributed data
> degrees_freedom <- 5  # Degrees of freedom for chi-square distribution
> num_samples <- 1000   # Number of samples to generate
> chi_square_data <- rchisq(num_samples, degrees_freedom)
> 
> # Plotting the chi-square distribution
> hist(chi_square_data, breaks = 20, freq = FALSE, 
+      main = "Chi-Square Distribution (df=5) using built in function", xlab = "Value", ylab = "Density",
+      col = "skyblue", border = "white")
> curve(dchisq(x, degrees_freedom), add = TRUE, col = "red", lwd = 2, lty = 2)
> legend("topright", legend = "Chi-Square Density", col = "red", lty = 2, bty = "n")

Using simstudy

> library(simstudy)
> 
> # creating definitions table (contains formula and/or link)
> def <- defData(varname = "x1", formula = 0, variance = 1, dist = "normal") # standard normal
> def <- defData(def, "chisq1df", formula = "x1^2", dist = "nonrandom")       # add computed column, hence nonrandom
> def <- defData(def, "x2", formula = 0, variance = 1, dist = "normal")      # another standard normal
> def <- defData(def, "chisq2df", 
+                formula = "(x1^2) + (x2^2)", dist = "nonrandom")            # another computed column
> 
> set.seed(2024)
> dt <- genData(1000, def)   # generate 1000 rows for each definitions and/or formula
> head(dt)
Key: <id>
      id         x1   chisq1df          x2  chisq2df
   <int>      <num>      <num>       <num>     <num>
1:     1  0.9819694 0.96426392 -0.05169614 0.9669364
2:     2  0.4687150 0.21969379 -0.49938784 0.4690820
3:     3 -0.1079713 0.01165781 -0.90253166 0.8262212
4:     4 -0.2128782 0.04531711 -0.37196309 0.1836737
5:     5  1.1580985 1.34119203 -0.18843330 1.3766991
6:     6  1.2923548 1.67018105 -0.73661845 2.2127878

Visualizing standard normal distributions.

> library(ggplot2)
> library(gridExtra)
> p1 <- ggplot(dt, aes(x = x1)) +
+   geom_histogram(aes(y = after_stat(density)), fill = "skyblue", color = "white") +
+   geom_density(fill = "skyblue", color = "red", alpha = 0.5) +
+   theme_bw() + labs(x = "X1")
> p2 <- ggplot(dt, aes(x = x2)) +
+   geom_histogram(aes(y = after_stat(density)), fill = "skyblue", color = "white") +
+   geom_density(fill = "skyblue", color = "red", alpha = 0.5) +
+   theme_bw() + labs(x = "X2")
> grid.arrange(p1, p2, nrow = 2)

> p1 <- ggplot(dt, aes(x = chisq1df)) +
+   geom_histogram(aes(y = after_stat(density)), fill = "royalblue", color = "white") +
+   geom_density(fill = "royalblue", color = "black", alpha = 0.5) + 
+   theme_bw() + labs(x = "Chi-squared distribition (df = 1)"); p1

> p2 <- ggplot(dt, aes(x = chisq2df)) +
+   geom_histogram(aes(y = after_stat(density)), fill = "royalblue", color = "white") +
+   geom_density(fill = "royalblue", color = "black", alpha = 0.5) + 
+   theme_bw() + labs(x = "Chi-squared distribition (df = 2)"); p2

> grid.arrange(p1, p2, nrow = 2)

Poisson

Mean and variance of Poisson variate are equal.

> def <- defData(varname = "h", formula = 40, dist = "poisson")   # mean = 40
> set.seed(2024)
> dt <- genData(1000, def)
> 
> round(dt[, .(avg = mean(h), var = var(h))], 2)
     avg   var
   <num> <num>
1: 39.71 37.84
LS0tDQp0aXRsZTogIlNhbXBsaW5nIERpc3RyaWJ1dGlvbnMiDQphdXRob3I6ICdNRCBBSFNBTlVMIElTTEFNJw0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGNvbW1lbnQgPSAiIiwgcHJvbXB0ID0gVFJVRSwgbWVzc2FnZT1GLCB3YXJuaW5nID0gRg0KKQ0KYGBgDQoNCi0tLQ0KDQojIENoaS1zcXVhcmVkDQoNCmBgYHtyfQ0KIyBHZW5lcmF0ZSA1IHN0YW5kYXJkIG5vcm1hbCB2YXJpYXRlcw0Kc2V0LnNlZWQoMjAyNCkNCngxIDwtIHJub3JtKDEwMDApDQp4MiA8LSBybm9ybSgxMDAwKQ0KeDMgPC0gcm5vcm0oMTAwMCkNCng0IDwtIHJub3JtKDEwMDApDQp4NSA8LSBybm9ybSgxMDAwKQ0KDQojIFNxdWFyZSB0aGUgdmFsdWVzIHRvIGNyZWF0ZSBjaGktc3F1YXJlIGRpc3RyaWJ1dGVkIGRhdGEgb2YgNSBkZWdyZWVzIG9mIGZyZWVkb20NCnhfc3EgPC0geDFeMiArIHgyXjIgKyB4M14yICsgeDReMiArIHg1XjINCg0KIyBQbG90dGluZyB0aGUgY2hpLXNxdWFyZSBkaXN0cmlidXRpb24NCmhpc3QoeF9zcSwgYnJlYWtzID0gMjAsIGZyZXEgPSBGQUxTRSwgDQogICAgIG1haW4gPSAiQ2hpLVNxdWFyZSBEaXN0cmlidXRpb24gKGRmPTUpIiwgDQogICAgIHhsYWIgPSAiVmFsdWUiLCB5bGFiID0gIkRlbnNpdHkiLCBjb2wgPSAic2t5Ymx1ZSIsIGJvcmRlciA9ICJ3aGl0ZSIpDQpjdXJ2ZShkY2hpc3EoeCwgZGYgPSA1KSwgYWRkID0gVFJVRSwgY29sID0gInJlZCIsIGx3ZCA9IDIsIGx0eSA9IDIpDQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gIkNoaS1TcXVhcmUgRGVuc2l0eSIsIGNvbCA9ICJyZWQiLCBsdHkgPSAyLCBidHkgPSAibiIpDQoNCmBgYA0KDQoNCg0KYGBge3J9DQojIEdlbmVyYXRlIGNoaS1zcXVhcmUgZGlzdHJpYnV0ZWQgZGF0YQ0KZGVncmVlc19mcmVlZG9tIDwtIDUgICMgRGVncmVlcyBvZiBmcmVlZG9tIGZvciBjaGktc3F1YXJlIGRpc3RyaWJ1dGlvbg0KbnVtX3NhbXBsZXMgPC0gMTAwMCAgICMgTnVtYmVyIG9mIHNhbXBsZXMgdG8gZ2VuZXJhdGUNCmNoaV9zcXVhcmVfZGF0YSA8LSByY2hpc3EobnVtX3NhbXBsZXMsIGRlZ3JlZXNfZnJlZWRvbSkNCg0KIyBQbG90dGluZyB0aGUgY2hpLXNxdWFyZSBkaXN0cmlidXRpb24NCmhpc3QoY2hpX3NxdWFyZV9kYXRhLCBicmVha3MgPSAyMCwgZnJlcSA9IEZBTFNFLCANCiAgICAgbWFpbiA9ICJDaGktU3F1YXJlIERpc3RyaWJ1dGlvbiAoZGY9NSkgdXNpbmcgYnVpbHQgaW4gZnVuY3Rpb24iLCB4bGFiID0gIlZhbHVlIiwgeWxhYiA9ICJEZW5zaXR5IiwNCiAgICAgY29sID0gInNreWJsdWUiLCBib3JkZXIgPSAid2hpdGUiKQ0KY3VydmUoZGNoaXNxKHgsIGRlZ3JlZXNfZnJlZWRvbSksIGFkZCA9IFRSVUUsIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKQ0KbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9ICJDaGktU3F1YXJlIERlbnNpdHkiLCBjb2wgPSAicmVkIiwgbHR5ID0gMiwgYnR5ID0gIm4iKQ0KDQpgYGANCg0KIyMgVXNpbmcgc2ltc3R1ZHkNCg0KYGBge3J9DQpsaWJyYXJ5KHNpbXN0dWR5KQ0KDQojIGNyZWF0aW5nIGRlZmluaXRpb25zIHRhYmxlIChjb250YWlucyBmb3JtdWxhIGFuZC9vciBsaW5rKQ0KZGVmIDwtIGRlZkRhdGEodmFybmFtZSA9ICJ4MSIsIGZvcm11bGEgPSAwLCB2YXJpYW5jZSA9IDEsIGRpc3QgPSAibm9ybWFsIikgIyBzdGFuZGFyZCBub3JtYWwNCmRlZiA8LSBkZWZEYXRhKGRlZiwgImNoaXNxMWRmIiwgZm9ybXVsYSA9ICJ4MV4yIiwgZGlzdCA9ICJub25yYW5kb20iKSAgICAgICAjIGFkZCBjb21wdXRlZCBjb2x1bW4sIGhlbmNlIG5vbnJhbmRvbQ0KZGVmIDwtIGRlZkRhdGEoZGVmLCAieDIiLCBmb3JtdWxhID0gMCwgdmFyaWFuY2UgPSAxLCBkaXN0ID0gIm5vcm1hbCIpICAgICAgIyBhbm90aGVyIHN0YW5kYXJkIG5vcm1hbA0KZGVmIDwtIGRlZkRhdGEoZGVmLCAiY2hpc3EyZGYiLCANCiAgICAgICAgICAgICAgIGZvcm11bGEgPSAiKHgxXjIpICsgKHgyXjIpIiwgZGlzdCA9ICJub25yYW5kb20iKSAgICAgICAgICAgICMgYW5vdGhlciBjb21wdXRlZCBjb2x1bW4NCg0Kc2V0LnNlZWQoMjAyNCkNCmR0IDwtIGdlbkRhdGEoMTAwMCwgZGVmKSAgICMgZ2VuZXJhdGUgMTAwMCByb3dzIGZvciBlYWNoIGRlZmluaXRpb25zIGFuZC9vciBmb3JtdWxhDQpoZWFkKGR0KQ0KYGBgDQoNClZpc3VhbGl6aW5nIHN0YW5kYXJkIG5vcm1hbCBkaXN0cmlidXRpb25zLg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCnAxIDwtIGdncGxvdChkdCwgYWVzKHggPSB4MSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBhZnRlcl9zdGF0KGRlbnNpdHkpKSwgZmlsbCA9ICJza3libHVlIiwgY29sb3IgPSAid2hpdGUiKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gInNreWJsdWUiLCBjb2xvciA9ICJyZWQiLCBhbHBoYSA9IDAuNSkgKw0KICB0aGVtZV9idygpICsgbGFicyh4ID0gIlgxIikNCnAyIDwtIGdncGxvdChkdCwgYWVzKHggPSB4MikpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBhZnRlcl9zdGF0KGRlbnNpdHkpKSwgZmlsbCA9ICJza3libHVlIiwgY29sb3IgPSAid2hpdGUiKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gInNreWJsdWUiLCBjb2xvciA9ICJyZWQiLCBhbHBoYSA9IDAuNSkgKw0KICB0aGVtZV9idygpICsgbGFicyh4ID0gIlgyIikNCmdyaWQuYXJyYW5nZShwMSwgcDIsIG5yb3cgPSAyKQ0KYGBgDQoNCmBgYHtyfQ0KcDEgPC0gZ2dwbG90KGR0LCBhZXMoeCA9IGNoaXNxMWRmKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IGFmdGVyX3N0YXQoZGVuc2l0eSkpLCBmaWxsID0gInJveWFsYmx1ZSIsIGNvbG9yID0gIndoaXRlIikgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICJyb3lhbGJsdWUiLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC41KSArIA0KICB0aGVtZV9idygpICsgbGFicyh4ID0gIkNoaS1zcXVhcmVkIGRpc3RyaWJpdGlvbiAoZGYgPSAxKSIpOyBwMQ0KcDIgPC0gZ2dwbG90KGR0LCBhZXMoeCA9IGNoaXNxMmRmKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IGFmdGVyX3N0YXQoZGVuc2l0eSkpLCBmaWxsID0gInJveWFsYmx1ZSIsIGNvbG9yID0gIndoaXRlIikgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICJyb3lhbGJsdWUiLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC41KSArIA0KICB0aGVtZV9idygpICsgbGFicyh4ID0gIkNoaS1zcXVhcmVkIGRpc3RyaWJpdGlvbiAoZGYgPSAyKSIpOyBwMg0KZ3JpZC5hcnJhbmdlKHAxLCBwMiwgbnJvdyA9IDIpDQpgYGANCg0KIyBQb2lzc29uDQoNCk1lYW4gYW5kIHZhcmlhbmNlIG9mIFBvaXNzb24gdmFyaWF0ZSBhcmUgZXF1YWwuIA0KYGBge3J9DQpkZWYgPC0gZGVmRGF0YSh2YXJuYW1lID0gImgiLCBmb3JtdWxhID0gNDAsIGRpc3QgPSAicG9pc3NvbiIpICAgIyBtZWFuID0gNDANCnNldC5zZWVkKDIwMjQpDQpkdCA8LSBnZW5EYXRhKDEwMDAsIGRlZikNCg0Kcm91bmQoZHRbLCAuKGF2ZyA9IG1lYW4oaCksIHZhciA9IHZhcihoKSldLCAyKQ0KYGBgDQoNCg==