Identifying Traits of Sports Talent in Malaysian Children Through Motor Performance

Identifying Traits of Sports Talent in Malaysian Children Through Motor Performance

Background

Evaluating children’s physical abilities is crucial for gaining insight into their growth and development, as well as for recognizing potential talent in sports. One common metric for this assessment is the Motor Performance Index (MPI), which measures different aspects of a child’s motor skills.

Objectives

The primary objective of this report is to analyze datasets related to children’s motor performance using summary statistics, visualizations, statistical models, and narratives. Specifically, it aims to:

  1. Explore the demographic profile and characteristics of the sample.
  2. Understand the relationship between the four motor skills.
  3. Explain how the children’s attributes affect their motor skills.

Data Used

The dataset used in the analysis is a slightly cleaned version of a dataset described in the article entitled “Kids motor performances datasets” from the Data in Brief journal. It consists of a single CSV file, where each row represents a seven year old Malaysian child. The following lists describe its variables:

Four properties of motor skills were recorded.

  • POWER (\(cm\)): Distance of a two-footed standing jump.
  • SPEED (\(sec\)): Time taken to sprint 20m.
  • FLEXIBILITY (\(cm\)): Distance reached forward in a sitting position.
  • COORDINATION (no.): Number of catches of a ball, out of ten.

Attributes of the children are included.

  • STATE: The Malaysian state where the child resides.
  • RESIDENTIAL: Whether the child lives in a rural or urban area.
  • GENDER: The child’s gender, Female or Male.
  • AGE: The child’s age in years.
  • WEIGHT (\(kg\)): The child’s bodyweight in kg.
  • HEIGHT (\(cm\)): The child’s height in cm.
  • BMI (\(kg/m^{2}\)): The child’s body mass index (weight in kg divided by height in meters squared).
  • CLASS (BMI): Categorization of the BMI: SEVERE THINNESS, THINNESS, NORMAL, OVERWEIGHT, OBESITY.

Full details of these metrics are described in sections 2.2 to 2.5 of the linked article.

# Load required packages
library(tidyverse)
library(dplyr)
library(ggplot2)
library(scales)
library(readr)

# Read the data set from the CSV file
motor_performance <- read_csv("data/motor-performance.csv", show_col_types = FALSE)

# Make a character vector for all 8 attributes
attributes <- c("STATE",
                "RESIDENTIAL",
                "GENDER",
                "AGE",
                "WEIGHT (kg)",
                "HEIGHT (CM)",
                "BMI (kg/m2)",
                "CLASS (BMI)")

# Make a character vector for all 4 motor skills
motor_skills <- c("POWER (cm)",
                  "SPEED (sec)",
                  "FLEXIBILITY (cm)",
                  "COORDINATION (no.)")

# Make a character vector for all numerical variables
num_vars <- c("AGE",
              "WEIGHT (kg)",
              "HEIGHT (cm)",
              "BMI (kg/m2)",
              "POWER (cm)",
              "SPEED (sec)",
              "FLEXIBILITY (cm)", 
              "COORDINATION (no.)")

Results & Discussion

Descriptive Analysis

The following information describe the demographic profile and characteristics of the sample composing of 1998 seven-year-old children who are in national primary regional school and participating in Malaysia’s physical fitness test (SEGAK).

Numerical Variables

Box Plots of the Numerical Attributes and Motor Skills

  • As expected, the mean age of the children is around 7, with a standard deviation of 0.05.
  • The mean weight is 22.21 kg, with a standard deviation of 5.41.
  • The mean height is 118.26 cm, with a standard deviation of 5.97.
  • The mean body mass index (BMI) is 15.77 (kg/m2), with a standard deviation of 3.06.
  • The mean distance of a two-footed standing jump is 96.20 cm, with a standard deviation of 17.59.
  • The mean time taken to sprint 20 m is 5.16 sec, with a standard deviation of 0.71.
  • The mean distance reached forward in a sitting position is 26.2615 cm, with a standard deviation of 4.93.
  • Out of ten, the mean number of ball catches is about 4, with a standard deviation of about 3.
  • We can see from the boxplots below that all numerical variables seem to be symmetrically distributed at their median.
# Subset numerical variable columms
stacked_num_vars <- stack(
    motor_performance %>% 
    dplyr::select(all_of(num_vars))
) %>%
    rename(Variable = ind) %>%
  mutate(Type = ifelse(Variable %in% c("AGE","WEIGHT (kg)","HEIGHT (cm)","BMI (kg/m2)"),
                         "Attribute", "Motor skill"))

# Summary statistics for numerical variables
sum_stats <- data.frame(Variable = num_vars) %>%
  bind_cols(as.data.frame(t(motor_performance %>%
                              summarise_at(num_vars, list(mean)) %>%
                              bind_rows(motor_performance %>%
                                        summarise_at(num_vars, list(sd)), motor_performance %>%
                                        summarise_at(num_vars, list(min)),
                                        motor_performance %>%
                                        summarise_at(num_vars, list(median)),
                                        motor_performance %>%
                                        summarise_at(num_vars, list(max)))
                             )) %>%
              rename(Mean = V1,
                     `Std. Dev.` = V2,
                     `Min.` = V3,
                     `Median` = V4,
                     `Max.` = V5))

rownames(sum_stats) <- 1: nrow(sum_stats)

# Boxplots for numerical variables
boxplots <- ggplot(stacked_num_vars, aes(x = Variable, y = values, fill=Type)) +       
  geom_boxplot(width = 0.75) +
  theme(legend.position = "top",  
          legend.justification=0.48,
          legend.key.size = unit(7, 'mm'),
          legend.text = element_text(margin = margin(r = 10, unit = "pt"),
                                     size = 8.5,
                                     color = "#65707C",
                                     family="sans serif"),
          legend.title = element_text(color = "#65707C",
                                   face = "bold",
                                   size = 9,
                                   family="sans serif"),  
          legend.key = element_rect(fill = NA),
          axis.title = element_text(color = "#65707C",
                                    face = "bold",
                                    size = 8.5,
                                    family="sans serif"),
          axis.text = element_text(color = "#65707C",
                                   size = 8,
                                   family="sans serif"),
          axis.line = element_line(colour = "grey",
                                   linewidth = 0.5),
          panel.grid.major = element_line(color = "grey",
                                          linetype="dashed",
                                          linewidth=0.25),
          panel.background = element_blank(),
          panel.border = element_rect(color="grey40",
                                      fill=NA),  
          panel.spacing = unit(2, "lines"),
          plot.title = element_text(color = "#65707C",
                                    hjust = 0.5,
                                    face = "bold",
                                    size= 11,
                                    family = "sans serif")) +
  labs(x = "\nVariable \n(unit)\n", y = "", fill = "Type:  ") +
  ggtitle("\n Fig. 1: Box Plots of the Numerical Attributes and Motor Skills          ") +
  scale_x_discrete(labels=c("AGE",
              "WEIGHT \n(kg)",
              "HEIGHT \n(cm)",
              "BMI \n(kg/m2)",
              "POWER \n(cm)",
              "SPEED \n(sec)",
              "FLEXIBILITY \n(cm)", 
              "COORDINATION \n(no.)")) + 
  scale_y_continuous(expand = c(0.01, 0),
                       limits = c(0, 175), 
                       breaks = seq(0, 175, by = 25)) +
  scale_fill_manual(values = c('#025C70',
                                 '#007E6C'))

# Save ggplot data
dat <- ggplot_build(boxplots)$data[[1]]

# Reformat boxplots' median line
final_boxplots <- boxplots + geom_segment(data=dat, aes(x=xmin, 
                                      xend=xmax,
                                      y=middle-.15,
                                      yend=middle-.15), 
                        color="grey75", 
                        linewidth=0.5,
                        inherit.aes = FALSE)

Categorical Variables

  • The five states where most of the sampled children reside are Selangor, Johor, Sabah, Sarawak, and Perak.
STATENumber of ChildrenPercentage
SELANGOR34917.47%
JOHOR24112.06%
SABAH20210.11%
SARAWAK1999.96%
PERAK1668.31%
KEDAH1336.66%
PAHANG1296.46%
KELANTAN1286.41%
PULAU PINANG1226.11%
KUALA LUMPUR904.50%
TERENGGANU904.50%
NEGERI SEMBILAN723.60%
MELAKA452.25%
PERLIS160.80%
PUTRAJAYA110.55%
LABUAN50.25%
  • The distribution of sampled children is almost balanced, with 1,052 urban residents (53%) and 946 rural residents (47%).
  • There is an equal distribution between male (999) and female (999) groups.
  • Majority or about 71% (1,419) of the sampled children have normal BMIs.
CLASS (BMI)Number of ChildrenPercentage
NORMAL141971.02%
OBESITY21810.91%
OVERWEIGHT20510.26%
THINNESS1085.41%
SEVERE THINNESS482.40%
# Count children per state
state_counts <- motor_performance %>%
  count(STATE, sort = TRUE)  %>%
  mutate(Percentage = label_percent(accuracy=0.01)(n/1998)) %>%
  rename(`Number of Children` = n)      

# Count children per residential
residential_counts <- motor_performance %>%
	count(RESIDENTIAL, sort = TRUE) %>%
  mutate(Percentage = label_percent(accuracy=0.01)(n/1998)) %>%
  rename(`Number of Children` = n)      

# Count children per gender
gender_counts <- motor_performance %>%
  count(GENDER, sort = TRUE) %>%
  mutate(Percentage = label_percent(accuracy=0.01)(n/1998)) %>%
  rename(`Number of Children` = n)      

# Count children per BMI class
bmi_class_counts <- motor_performance %>%
  count(`CLASS (BMI)`, sort = TRUE) %>%
  mutate(Percentage = label_percent(accuracy=0.01)(n/1998)) %>%
  rename(`Number of Children` = n)              

Correlation Analysis

Using the sample, the following observations can be said about the pairwise correlations of the four motor skills:

  • There is a low negative correlation of 0.36 between power and speed.
  • Other pairs of variables seem to have negligible levels of correlation.

(This table was used for interpreting correlation coefficients.)

# Install & load the "corrplot" package for correlation plots
#install.packages("corrplot")
library(corrplot)

# Subset motor skill columns
motor_skills_df <- motor_performance %>%
  dplyr::select(all_of(motor_skills)) %>%
    rename(POWER = `POWER (cm)`,
           SPEED = `SPEED (sec)`,
           FLEXIBILITY = `FLEXIBILITY (cm)`,
           COORDINATION = `COORDINATION (no.)`)

# Color scheme for the correlation plot
col <- colorRampPalette(c("#025C70", "white", "#007E6C"))

# Correlation plot for motor skills
#par(family="sans serif")
#corrplot(cor(motor_skills_df), 
#         method="color", 
#         col=col(20),
#         order="FPC",
#         type="lower",
#         diag=FALSE, 
#         cl.cex=0.5,
#         tl.cex=0.9,
#         tl.srt=0,
#         tl.col="#65707C",
#         col.main="#65707C",
#         addCoef.col="#65707C",
#         addgrid.col="black",
#         main="\nFig. 6: Correlation Plot of the Four Motor Skills          ",
#         cex.main=1.1,
#         mar = c(5,3.5,6,0)
#        )

# Pairwise correlation coefficients for motor skills
motor_performance.cor <- cor(motor_performance %>%
  dplyr::select(all_of(motor_skills)))
                             
pairwise_corr <- data.frame(Variable = num_vars[5:8]) %>% 
  bind_cols(as.data.frame(round(motor_performance.cor, 2)) %>%
    dplyr::select(all_of(motor_skills)))

rownames(pairwise_corr) <- 1:nrow(pairwise_corr)

Regression Analysis

The Motor Performance Index (MPI) was computed based on the sum of the four motors skills, which served as the dependent variable in a general linear model (GLM). The independent variables included all eight child attributes, with dummy variables automatically generated for each categorical attribute.

Full Model

The following infomation describe the full model:

  • It has a residual standard error of 18.5998 and an R-square of 0.1143 (i.e. 11.43% of the variation in MPI can be explained by the 25 independent variables).
  • Seven (7) independent variables were significant at 0.05 level, which are:</br> ㅤ1. STATE KEDAH</br> ㅤ2. STATE KUALA LUMPUR</br> ㅤ3. STATE PULAU PINANG</br> ㅤ4. STATE SABAH</br> ㅤ5. STATE SELANGOR</br> ㅤ6. GENDER M</br> ㅤ7. CLASS (BMI) THINNESS</br>
## ---------- Regression Analysis

# Create an index variable called MPI
data_for_regression <- motor_performance %>% 
    mutate(MPI = (`POWER (cm)` + `SPEED (sec)` + `FLEXIBILITY (cm)` + `COORDINATION (no.)`))

## ----- Full Model
full_model <- lm(MPI ~ STATE + RESIDENTIAL + GENDER + AGE + `WEIGHT (kg)` + `HEIGHT (cm)` + `BMI (kg/m2)` + `CLASS (BMI)`, data = data_for_regression)

# Summary statistics of the full model
paste("Residual standard error:", round(summary.lm(full_model)$sigma, 4), 
      " ,  R-square: ", round(summary.lm(full_model)$r.squared, 4), 
      " ,  Adj. R-square: ", round(summary.lm(full_model)$adj.r.squared, 4))

# Full model's table of estimated coefficients, their SEs, t-stats, and (two-sided) p-values
summary_full <- data.frame(
    Variable = rownames(as.data.frame(summary.lm(full_model)$coefficients))
) %>%
  bind_cols(as.data.frame(summary.lm(full_model)$coefficients))

rownames(summary_full) <- 1:nrow(summary_full)
summary_full

<span style=white-space:pre-wrap>’Residual standard error: 18.5998 , R-square: 0.1143 , Adj. R-square: 0.103’</span>

VariableEstimateStd. Errort valuePr(>|t|)
1(Intercept)65.021735469.1123732 0.940811793.469165e-01
2STATEKEDAH 4.9864502 2.0291488 2.457409831.407982e-02
3STATEKELANTAN-0.2035077 2.0697095-0.098326699.216829e-01
4STATEKUALA LUMPUR 4.9068455 2.3175311 2.117272723.436159e-02
5STATELABUAN-4.8443791 8.4380719-0.574109735.659590e-01
6STATEMELAKA-5.2062606 3.0569554-1.703086868.870939e-02
7STATENEGERI SEMBILAN-3.4623878 2.5126976-1.377956421.683731e-01
8STATEPAHANG-1.5492991 2.0377064-0.760315224.471571e-01
9STATEPERAK-2.4083089 1.8931314-1.272129782.034770e-01
10STATEPERLIS-2.0499381 4.8442085-0.423172976.722152e-01
11STATEPULAU PINANG-4.4417736 2.0795204-2.135960553.280546e-02
12STATEPUTRAJAYA-5.0581068 5.7489537-0.879830853.790582e-01
13STATESABAH 6.4421313 1.7943039 3.590323453.383426e-04
14STATESARAWAK 0.8817717 1.8214728 0.484098226.283699e-01
15STATESELANGOR 4.1372652 1.5689123 2.637027728.429271e-03
16STATETERENGGANU 0.8072483 2.3244795 0.347281317.284170e-01
17RESIDENTIALURBAN-1.5802387 0.8839906-1.787619277.399097e-02
18GENDERM10.0430571 0.842961311.914019821.185731e-31
19AGE 0.8084578 8.4729958 0.095415829.239942e-01
20`WEIGHT (kg)`-1.3840064 0.7113665-1.945560225.184951e-02
21`HEIGHT (cm)` 0.5578033 0.2966919 1.880075786.024505e-02
22`BMI (kg/m2)` 1.3365364 1.0106452 1.322458521.861689e-01
23`CLASS (BMI)`OBESITY-3.5346197 2.8041009-1.260518052.076317e-01
24`CLASS (BMI)`OVERWEIGHT 0.9695707 1.7353525 0.558716845.764184e-01
25`CLASS (BMI)`SEVERE THINNESS-3.3867506 2.9608854-1.143830362.528328e-01
26`CLASS (BMI)`THINNESS-6.0155153 1.9871211-3.027251452.499846e-03
plot(full_model)

png

png

png

png

Reduced Model

Using a backward elimination procedure, a reduced model consisting of 23 predictor variables was developed. This model excludes the variables for age and body mass index (BMI in $kg/m^{2}$), likely due to the homogeneity of children’s ages within the sample and the correlation of BMI with other variables, specifically height and weight.

The following information describe the reduced model:

  • It has a slightly better residual standard error of 18.5986 compared to the full model.
  • The model’s R-square slightly increased to 0.1135, that is, 11.35% of the variation in MPI can be accounted by the 23 independent variables in the model”.
  • The same seven (7) independent variables with the addition of WEIGHT ($kg$) were significant at 0.05 level.
# Install & load the "MASS" package for backward stepwise regression
# install.packages("MASS")
library(MASS)

# 1 here means the intercept 
null <- lm(`POWER (cm)` ~ 1, data = data_for_regression)

# Backward elimination
bw_elim <- stepAIC(full_model, scope=list(lower=null, upper=full_model),
                   data = data_for_regression, direction='backward')

## ----- First Reduced Model
reduced_model1 <- lm(MPI ~ STATE + RESIDENTIAL + GENDER + `WEIGHT (kg)` + `HEIGHT (cm)` + `CLASS (BMI)`, data = data_for_regression)

# Summary statistics of the first reduced model
paste("Residual standard error:", round(summary.lm(reduced_model1)$sigma, 4), 
      " ,  R-square: ", round(summary.lm(reduced_model1)$r.squared, 4), 
      " ,  Adj. R-square: ", round(summary.lm(reduced_model1)$adj.r.squared, 4))

# First reduced model's table of estimated coefficients, their SEs, t-stats, and (two-sided) p-values
summary_reduced1 <- data.frame(
    Variable = rownames(as.data.frame(summary.lm(reduced_model1)$coefficients))
) %>%
  bind_cols(as.data.frame(summary.lm(reduced_model1)$coefficients))

rownames(summary_reduced1) <- 1:nrow(summary_reduced1)
summary_reduced1

#plot(reduced_model1)
Start:  AIC=11706.73
MPI ~ STATE + RESIDENTIAL + GENDER + AGE + `WEIGHT (kg)` + `HEIGHT (cm)` + 
    `BMI (kg/m2)` + `CLASS (BMI)`

                Df Sum of Sq    RSS   AIC
- AGE            1         3 682219 11705
- `BMI (kg/m2)`  1       605 682821 11706
<none>                       682216 11707
- RESIDENTIAL    1      1106 683322 11708
- `HEIGHT (cm)`  1      1223 683439 11708
- `WEIGHT (kg)`  1      1309 683526 11709
- `CLASS (BMI)`  4      6009 688225 11716
- STATE         15     23466 705682 11744
- GENDER         1     49106 731322 11844

Step:  AIC=11704.74
MPI ~ STATE + RESIDENTIAL + GENDER + `WEIGHT (kg)` + `HEIGHT (cm)` + 
    `BMI (kg/m2)` + `CLASS (BMI)`

                Df Sum of Sq    RSS   AIC
- `BMI (kg/m2)`  1       605 682824 11704
<none>                       682219 11705
- RESIDENTIAL    1      1114 683333 11706
- `HEIGHT (cm)`  1      1224 683443 11706
- `WEIGHT (kg)`  1      1310 683529 11707
- `CLASS (BMI)`  4      6006 688225 11714
- STATE         15     23464 705683 11742
- GENDER         1     49121 731340 11842

Step:  AIC=11704.51
MPI ~ STATE + RESIDENTIAL + GENDER + `WEIGHT (kg)` + `HEIGHT (cm)` + 
    `CLASS (BMI)`

                Df Sum of Sq    RSS   AIC
<none>                       682824 11704
- `HEIGHT (cm)`  1      1016 683840 11706
- RESIDENTIAL    1      1099 683924 11706
- `WEIGHT (kg)`  1      1798 684622 11708
- `CLASS (BMI)`  4      6336 689160 11715
- STATE         15     23467 706291 11742
- GENDER         1     49004 731828 11841

<span style=white-space:pre-wrap>’Residual standard error: 18.5986 , R-square: 0.1135 , Adj. R-square: 0.1032’</span>

VariableEstimateStd. Errort valuePr(>|t|)
1(Intercept)114.683746210.549858910.87064278.972322e-27
2STATEKEDAH 4.9995849 2.0288212 2.46428071.381351e-02
3STATEKELANTAN -0.2746474 2.0685727-0.13277148.943877e-01
4STATEKUALA LUMPUR 4.8511979 2.3144001 2.09609303.620098e-02
5STATELABUAN -4.7655878 8.4361872-0.56489835.722071e-01
6STATEMELAKA -4.8875654 3.0464262-1.60436031.087946e-01
7STATENEGERI SEMBILAN -3.4943188 2.5121631-1.39096021.643943e-01
8STATEPAHANG -1.5896358 2.0353551-0.78101154.348894e-01
9STATEPERAK -2.5389245 1.8901321-1.34325241.793447e-01
10STATEPERLIS -2.3512322 4.8361233-0.48618126.268927e-01
11STATEPULAU PINANG -4.5448868 2.0772698-2.18791362.879278e-02
12STATEPUTRAJAYA -5.2458440 5.7459381-0.91296563.613721e-01
13STATESABAH 6.3322964 1.7922115 3.53323064.199524e-04
14STATESARAWAK 0.9161919 1.8211668 0.50307966.149644e-01
15STATESELANGOR 4.1373446 1.5688082 2.63725348.423618e-03
16STATETERENGGANU 0.6892802 2.3226322 0.29676687.666758e-01
17RESIDENTIALURBAN -1.5740942 0.8829311-1.78280537.477163e-02
18GENDERM 10.0313573 0.842801611.90239491.347188e-31
19`WEIGHT (kg)` -0.4870348 0.2136321-2.27978332.272680e-02
20`HEIGHT (cm)` 0.1959724 0.1143583 1.71367098.674619e-02
21`CLASS (BMI)`OBESITY -3.2599963 2.7962650-1.16583962.438202e-01
22`CLASS (BMI)`OVERWEIGHT 1.1859822 1.7275272 0.68652014.924658e-01
23`CLASS (BMI)`SEVERE THINNESS -3.5142913 2.9589427-1.18768482.351005e-01
24`CLASS (BMI)`THINNESS -6.2734191 1.9763175-3.17429731.525143e-03

Diagnostics Checking

The reduced model was evaluated for assumptions to demonstrate its validity.

Multicollinearity

Four of the six attributes exhibit Variance Inflation Factor (VIF) values near 1, whereas two attributes have values exceeding five. This indicates a potential presence of multicollinearity within the model, particularly between WEIGHT ($kg$) and CLASS (BMI).

# Install & load the "car" package for Variance inflation factor (VIF)
#install.packages("car")
library(car)

# VIF for detecting multicollinearity
vif_1 <- data.frame(Attribute = c("STATE",
                        "RESIDENTIAL",
                        "GENDER",
                        "WEIGHT (kg)",
                        "HEIGHT (cm)", "CLASS (BMI)")) %>%
  bind_cols(as.data.frame(vif(reduced_model1))) 

rownames(vif_1) <- 1:nrow(vif_1)
vif_1
AttributeGVIFDfGVIF^(1/(2*Df))
1STATE1.222732151.006725
2RESIDENTIAL1.122544 11.059502
3GENDER1.025710 11.012773
4WEIGHT (kg)7.717934 12.778117
5HEIGHT (cm)2.694061 11.641360
6CLASS (BMI)5.389246 41.234358

Excluding WEIGHT ($kg$) from the model resulted in VIF values nearing 1 for all attributes, indicating that none of the five attributes are significantly correlated.

## ----- Second Reduced Model
reduced_model2 <- lm(MPI ~ STATE + RESIDENTIAL + GENDER + `HEIGHT (cm)` + `CLASS (BMI)`,
                     data = data_for_regression)

# Variance inflation factor (VIF) for detecting multicollinearity
vif_2 <- data.frame(Attribute = c("STATE",
                                 "RESIDENTIAL",
                                 "GENDER",
                                 "HEIGHT (cm)",
                                 "CLASS (BMI)")) %>%
  bind_cols(as.data.frame(vif(reduced_model2))) 

rownames(vif_2) <- 1:nrow(vif_2)
vif_2
AttributeGVIFDfGVIF^(1/(2*Df))
1STATE1.209391151.006357
2RESIDENTIAL1.121651 11.059080
3GENDER1.025265 11.012554
4HEIGHT (cm)1.106692 11.051994
5CLASS (BMI)1.131043 41.015512
Homoscedasticity

Based on the results of the Breusch-Pagan test, with a p-value of 0.0001568 (significant at the 0.05 level), we reject the null hypothesis of constant variances, suggesting a violation of the homoscedasticity assumption in this model. Remedial measures, such as Weighted Least Squares (WLS) or data transformation, may be required.

   
          Fig. 7: Studentized Breusch-Pagan Test

# Install & load the "lmtest" package for Breusch-Pagan (BP) Test
install.packages("lmtest")
library(lmtest)

# BP Test for determining presence of heteroscedasticity
bp_test_stat <- bptest(reduced_model2)$statistic
names(bp_test_stat)[1] <- "Test statistic"

# Test statistic
bp_test_stat

# Degrees of freedom
bptest(reduced_model2)$parameter

# P-value
bp_pv <- bptest(reduced_model2)$p.value
names(bp_pv)[1] <- "p-value"
bp_pv 

Test statistic: 54.1480970638192

df: 22

p-value: 0.000156773259412571

Autocorrelation

The model was also tested for first-order autocorrelation in the random error terms using the Breusch-Godfrey test. With a p-value below 0.05, we reject the null hypothesis and conclude that autocorrelation exists among the residuals at an order of 1 or less.

   
          Fig. 8: Breusch-Godfrey Test for Serial Correlation of Order up to 1

# BP Test for determining presence of autocorrelation
bg_test_stat <- bgtest(reduced_model2)$statistic
names(bg_test_stat)[1] <- "Test statistic"

# Test-statistic
bg_test_stat

# Degrees of freedom
bgtest(reduced_model2)$parameter

# P-value
bg_pv <- bgtest(reduced_model2)$p.value
names(bg_pv)[1] <- "p-value"
bg_pv 

Test statistic: 371.95016031299

df: 1

p-value: 7.04022815928729e-83

Normality

Shapiro-Wilk normality test shows a p-value of 0.6914, which is insignificant at 0.05 level. Therefore, we do not reject the null hypothesis of normally distributed error terms and conclude that the residuals are drawn from a normal distribution.

   
          Fig. 9: Shapiro-Wilk Normality Test

# Shapiro-Wilk Normality Test
sw_test_stat <- shapiro.test(resid(reduced_model2))$statistic
names(sw_test_stat)[1] <- "Test statistic"
sw_test_stat

# P-value
sw_pv <- shapiro.test(resid(reduced_model2))$p.value
names(sw_pv)[1] <- "p-value"
sw_pv

Test statistic: 0.999306609968656

p-value: 0.691396526904326

q <- (rank(rstandard(reduced_model2)) - .5) / length(rstandard(reduced_model2))


residuals_df <- data.frame(residuals = reduced_model2$residuals,
               fitted_values = reduced_model2$fitted.values,
                           standardized_residuals = rstandard(reduced_model2),
               theoretical_quantiles = qnorm(
                 q,
                 mean(rstandard(reduced_model2)),
                 sd(rstandard(reduced_model2))
               ),
               leverage = hatvalues(reduced_model2)
              )
write.csv(residuals_df, "residuals_df.csv")

Final Model

The following infomation describe the final model:

  • The final model has a standard error of 18.6184 in predicting MPI.
  • The model’s R-square is 0.1111, which means that 11.11% of the variation in MPI can be explained by the 22 independent variables.
  • Eight (8) independent variables were significant at 0.05 level, which are:</br> ㅤ1. STATE KEDAH</br> ㅤ2. STATE KUALA LUMPUR</br> ㅤ3. STATE PULAU PINANG</br> ㅤ4. STATE SABAH</br> ㅤ5. STATE SELANGOR</br> ㅤ6. GENDER M</br> ㅤ7. CLASS (BMI) OBESITY</br> ㅤ8. CLASS (BMI) THINNESS
## ----- Second Reduced / Final Model

# Summary statistics of the second reduced / final model
paste("Residual standard error:", round(summary.lm(reduced_model2)$sigma, 4), 
      " ,  R-square: ", round(summary.lm(reduced_model2)$r.squared, 4), 
      " ,  Adj. R-square: ", round(summary.lm(reduced_model2)$adj.r.squared, 4))

# Second reduced / final model's table of estimated coefficients, their SEs, t-stats, and (two-sided) p-values
summary_reduced2 <- data.frame(Variable = rownames(
                  as.data.frame(summary.lm(reduced_model2)$coefficients))
                          ) %>%
  bind_cols(as.data.frame(summary.lm(reduced_model2)$coefficients))
rownames(summary_reduced2) <- 1:nrow(summary_reduced2)

summary_reduced2

<span style=white-space:pre-wrap>’Residual standard error: 18.6184 , R-square: 0.1111 , Adj. R-square: 0.1012’</span>

VariableEstimateStd. Errort valuePr(>|t|)
1(Intercept)128.1864249888.7396832714.667170532.601903e-46
2STATEKEDAH 5.0677862552.03075510 2.495518171.265837e-02
3STATEKELANTAN -0.0274539922.06792296-0.013276129.894088e-01
4STATEKUALA LUMPUR 4.7379628812.31632457 2.045465884.094119e-02
5STATELABUAN -4.3158812908.44283806-0.511188456.092762e-01
6STATEMELAKA -5.0420165603.04890750-1.653712549.834485e-02
7STATENEGERI SEMBILAN -3.5651145712.51463902-1.417744071.564232e-01
8STATEPAHANG -1.5279634612.03733681-0.749980794.533556e-01
9STATEPERAK -2.5434506631.89213853-1.344220111.790316e-01
10STATEPERLIS -2.2808527244.84116094-0.471137556.375945e-01
11STATEPULAU PINANG -4.3208859472.07714846-2.080200833.763577e-02
12STATEPUTRAJAYA -5.1737604625.75195359-0.899478833.685073e-01
13STATESABAH 6.4241102271.79366189 3.581561423.498079e-04
14STATESARAWAK 0.8675009181.82297565 0.475870826.342190e-01
15STATESELANGOR 4.1113874901.57043298 2.617996158.912351e-03
16STATETERENGGANU 0.8063727862.32453043 0.346897077.287056e-01
17RESIDENTIALURBAN -1.5173342060.88351733-1.717379118.606669e-02
18GENDERM 9.9913600340.8435138811.844926632.555312e-31
19`HEIGHT (cm)` -0.0041502650.07337333-0.056563679.548985e-01
20`CLASS (BMI)`OBESITY -8.7818531771.39881818-6.278051934.203575e-10
21`CLASS (BMI)`OVERWEIGHT -1.0696467231.41763537-0.754528814.506217e-01
22`CLASS (BMI)`SEVERE THINNESS -1.0340181812.75459885-0.375378867.074190e-01
23`CLASS (BMI)`THINNESS -4.8262677261.87358878-2.575948241.006865e-02

Conclusion

Using the available data and results of the analyses, the following conclusions can be drawn about the attributes, motor skills, and motor performances of the seven-year-old Malaysians in the sample:

  • Children from Kedah, Kuala Lumpur, Sabah, and Selangor appear to have higher MPIs among others.
  • Male children are more likely to have higher MPIs than their female counterparts.
  • Children with BMI classes of “Obesity” and “Thinness” have potentially less MPIs compared to the other classes.

Recommendation

Based on these conclusions, among the eight attributes that were considered in identifying gifted young Malaysian sports talents, their STATE, GENDER, and CLASS (BMI) are the most significant. Specifically, the characteristics that can increase the chances of having a high Motor Performance Index (MPI) are:

  • residing in the states of Kedah, Kuala Lumpur, Sabah, or Selangor;
  • being male; and
  • having a “Normal” BMI class.

Despite these recommended characteristics, however, one major limitation of the final model is it accounts for only a relatively small percentage of the variation in MPI. Therefore, it is suggested to look for additional attributes or variables that can potentially contribute to motor performance.

Appendix

Tables

Summary statistics of the numerical variables
VariableMeanStd. Dev.Min.MedianMax.
1AGE 7.057508 0.04944554 7.00 7.10 7.1
2WEIGHT (kg) 22.208253 5.4122259711.00 21.00 49.0
3HEIGHT (cm)118.259660 5.9734887776.50118.05140.0
4BMI (kg/m2) 15.774274 3.06391583 8.20 15.00 35.1
5POWER (cm) 96.20070117.5942489450.00 96.00160.0
6SPEED (sec) 5.163423 0.70676451 1.59 5.10 10.0
7FLEXIBILITY (cm) 26.261512 4.93084932 9.00 26.50 41.0
8COORDINATION (no.) 4.079079 2.78017028 1.00 4.00 10.0
Counts and percentages of the categorical variables
AttributeCategoryNumber of childrenPercentage
STATESELANGOR 34917.47%
STATEJOHOR 24112.06%
STATESABAH 20210.11%
STATESARAWAK 1999.96%
STATEPERAK 1668.31%
STATEKEDAH 1336.66%
STATEPAHANG 1296.46%
STATEKELANTAN 1286.41%
STATEPULAU PINANG 1226.11%
STATEKUALA LUMPUR 904.50%
STATETERENGGANU 904.50%
STATENEGERI SEMBILAN 723.60%
STATEMELAKA 452.25%
STATEPERLIS 160.80%
STATEPUTRAJAYA 110.55%
STATELABUAN 50.25%
RESIDENTIALURBAN105252.65%
RESIDENTIALRURAL 94647.35%
GENDERF 99950.00%
GENDERM 99950.00%
CLASS (BMI)NORMAL141971.02%
CLASS (BMI)OBESITY 21810.91%
CLASS (BMI)OVERWEIGHT 20510.26%
CLASS (BMI)THINNESS 1085.41%
CLASS (BMI)SEVERE THINNESS 482.40%
Direct Link