1. Load Required Libraries

# Install if needed:
# install.packages("table1")
# install.packages("lessR")

library(table1)
## 
## Attaching package: 'table1'
## The following objects are masked from 'package:base':
## 
##     units, units<-
library(lessR)
## 
## lessR 4.4.3                         feedback: gerbing@pdx.edu 
## --------------------------------------------------------------
## > d <- Read("")  Read data file, many formats available, e.g., Excel
##   d is default data frame, data= in analysis routines optional
## 
## Many examples of reading, writing, and manipulating data, 
## graphics, testing means and proportions, regression, factor analysis,
## customization, forecasting, and aggregation from pivot tables
##   Enter: browseVignettes("lessR")
## 
## View lessR updates, now including time series forecasting
##   Enter: news(package="lessR")
## 
## Interactive data analysis
##   Enter: interact()
## 
## Attaching package: 'lessR'
## The following object is masked from 'package:table1':
## 
##     label

2. Read the Data

bw <- read.csv("/Users/thaovu/Downloads/birthwt.csv")

3. Data Wrangling

# Recode race
bw$ethnicity <- factor(bw$race, levels = c(1, 2, 3), labels = c("White", "Black", "Other"))

# Recode smoke
bw$smoking <- factor(bw$smoke, levels = c(1, 2), labels = c("Yes", "No"))

# Recode low
bw$low.bw <- factor(bw$low, levels = c(0, 1), labels = c("Normal", "Low BW"))

# Create mwt variable
bw$mwt <- bw$lwt * 0.45

4. Descriptive Table by Low Birthweight

# Define labels
label(bw$age) <- "Age"
label(bw$ethnicity) <- "Ethnicity"
label(bw$smoking) <- "Smoking"
label(bw$mwt) <- "Mother Weight (kg)"
label(bw$bwt) <- "Birth Weight (g)"

# Create Table 1
table1(~ age + ethnicity + smoking + mwt + bwt | low.bw, data = bw)
Normal
(N=130)
Low BW
(N=59)
Overall
(N=189)
Age
Mean (SD) 23.7 (5.58) 22.3 (4.51) 23.2 (5.30)
Median [Min, Max] 23.0 [14.0, 45.0] 22.0 [14.0, 34.0] 23.0 [14.0, 45.0]
Ethnicity
White 73 (56.2%) 23 (39.0%) 96 (50.8%)
Black 15 (11.5%) 11 (18.6%) 26 (13.8%)
Other 42 (32.3%) 25 (42.4%) 67 (35.4%)
Smoking
Yes 44 (33.8%) 30 (50.8%) 74 (39.2%)
No 0 (0%) 0 (0%) 0 (0%)
Missing 86 (66.2%) 29 (49.2%) 115 (60.8%)
Mother Weight (kg)
Mean (SD) 60.0 (14.3) 55.0 (12.0) 58.4 (13.8)
Median [Min, Max] 55.6 [38.3, 113] 54.0 [36.0, 90.0] 54.5 [36.0, 113]
Birth Weight (g)
Mean (SD) 3330 (478) 2100 (391) 2940 (729)
Median [Min, Max] 3270 [2520, 4990] 2210 [709, 2500] 2980 [709, 4990]

5. Histogram of Birth Weight

Histogram(bwt, main = "Histogram of Birth Weight", xlab = "Birth Weight (g)",fill= "blue", ,data=bw)

## >>> Suggestions 
## bin_width: set the width of each bin 
## bin_start: set the start of the first bin 
## bin_end: set the end of the last bin 
## Histogram(bwt, density=TRUE)  # smoothed curve + histogram 
## Plot(bwt)  # Violin/Box/Scatterplot (VBS) plot 
## 
## --- bwt --- 
##  
##       n   miss       mean         sd        min        mdn        max 
##      189      0    2944.59     729.21     709.00    2977.00    4990.00 
##  
## 
##   
## --- Outliers ---     from the box plot: 1 
##  
## Small        Large 
## -----        ----- 
##  709.0            
## 
## 
## Bin Width: 500 
## Number of Bins: 9 
##  
##          Bin  Midpnt  Count    Prop  Cumul.c  Cumul.p 
## ----------------------------------------------------- 
##   500 > 1000     750      1    0.01        1     0.01 
##  1000 > 1500    1250      4    0.02        5     0.03 
##  1500 > 2000    1750     14    0.07       19     0.10 
##  2000 > 2500    2250     40    0.21       59     0.31 
##  2500 > 3000    2750     38    0.20       97     0.51 
##  3000 > 3500    3250     45    0.24      142     0.75 
##  3500 > 4000    3750     38    0.20      180     0.95 
##  4000 > 4500    4250      7    0.04      187     0.99 
##  4500 > 5000    4750      2    0.01      189     1.00 
## 

6. Distribution of Ethnicity

BarChart(ethnicity, main = "Distribution of Ethnicity", xlab = "Ethnicity", data=bw)

## >>> Suggestions
## BarChart(ethnicity, horiz=TRUE)  # horizontal bar chart
## BarChart(ethnicity, fill="reds")  # red bars of varying lightness
## PieChart(ethnicity)  # doughnut (ring) chart
## Plot(ethnicity)  # bubble plot
## Plot(ethnicity, stat="count")  # lollipop plot 
## 
## --- ethnicity --- 
## 
## Missing Values: 0 
## 
##                White  Black  Other     Total 
## Frequencies:      96     26     67       189 
## Proportions:   0.508  0.138  0.354     1.000 
## 
## Chi-squared test of null hypothesis of equal probabilities 
##   Chisq = 39.270, df = 2, p-value = 0.000

7. Correlation: Mother Weight vs. Birth Weight

# Scatter plot with correlation details
ScatterPlot(mwt, bwt, data = bw,
            main = "Mother Weight vs. Birth Weight",
            xlab = "Mother Weight (kg)",
            ylab = "Birth Weight (g)",
            fit = "lm",           # Add regression line
)
## 
## 
## >>> Suggestions  or  enter: style(suggest=FALSE)
## Plot(mwt, bwt, enhance=TRUE)  # many options
## Plot(mwt, bwt, fill="skyblue")  # interior fill color of points
## Plot(mwt, bwt, out_cut=.10)  # label top 10% from center as outliers 
## 
## 
## >>> Pearson's product-moment correlation 
##  
## Number of paired values with neither missing, n = 189 
## Sample Correlation of mwt and bwt: r = 0.186 
##   
## Hypothesis Test of 0 Correlation:  t = 2.585,  df = 187,  p-value = 0.011 
## 95% Confidence Interval for Correlation:  0.044 to 0.320 
##   
## 
##   Line: b0 = 2369.624    b1 = 9.842    Linear Model MSE = 516,155.173   Rsq = 0.034
## 
# 2. Fit linear model and add regression line
fit <- lm(bwt ~ mwt, data = bw)
abline(fit, col = "blue", lwd = 2)

# 3. Calculate Pearson correlation
r_val <- round(cor(bw$mwt, bw$bwt, use = "complete.obs"), 2)

# 4. Annotate the correlation coefficient on the plot
legend("topleft", legend = paste("Pearson r =", r_val),
       bty = "n", text.col = "red")