I am trying to get a ggplot graph from mardiaTest function but it gives me an error as follows:
Error in eval(expr, envir, enclos) : object 'd' not found
Here is the reproducible example:
Setting class for mardiaTest function
setClass("mardia",
slots = c(g1p = "numeric", chi.skew="numeric", p.value.skew="numeric", chi.small.skew="numeric",
p.value.small="numeric", g2p="numeric", z.kurtosis="numeric", p.value.kurt="numeric", dname="character", dataframe="data.frame"))
setGeneric("mardia", function(object) standardGeneric("mardia"))
setMethod("show",
signature = "mardia",
definition = function(object) {
n=dim(object@dataframe)[1]
cat(" Mardia's Multivariate Normality Test", "\n", sep = " ")
cat("---------------------------------------", "\n", sep = " ")
cat(" data :", object@dname, "\n\n", sep = " ")
cat(" g1p :", object@g1p, "\n", sep = " ")
cat(" chi.skew :", object@chi.skew, "\n", sep = " ")
cat(" p.value.skew :", object@p.value.skew, "\n\n", sep = " ")
cat(" g2p :", object@g2p, "\n", sep = " ")
cat(" z.kurtosis :", object@z.kurtosis, "\n", sep = " ")
cat(" p.value.kurt :", object@p.value.kurt, "\n\n", sep = " ")
cat(" chi.small.skew :", object@chi.small.skew, "\n", sep = " ")
cat(" p.value.small :", object@p.value.small, "\n\n", sep = " ")
if(n>=20){
cat(if((object@p.value.skew > 0.05) & (object@p.value.kurt > 0.05)){" Result : Data is multivariate normal."}
else {" Result : Data is not multivariate normal."},"\n\n")
}
if(n<20){
cat(if((object@p.value.small > 0.05) & (object@p.value.kurt > 0.05)){" Result : Data is multivariate normal."}
else {" Result : Data is not multivariate normal."},"\n\n")
}
cat("NOTE: For multivariate normality, both p-values of skewness and kurtosis statistics should be greater than 0.05. If sample size (n) is less than 20 then 'p.value.small' should be used as significance value of skewness instead of 'p.value.skew'.", "\n", sep = " ")
cat("---------------------------------------", "\n\n", sep = " ")
invisible(NULL)
})
setClass("hz",
slots = c(HZ = "numeric", p.value="numeric", dname="character", dataframe="data.frame"))
setGeneric("hz", function(object) standardGeneric("hz"))
setMethod("show",
signature = "hz",
definition = function(object) {
cat(" Henze-Zirkler's Multivariate Normality Test", "\n", sep = " ")
cat("---------------------------------------------", "\n", sep = " ")
cat(" data :", object@dname, "\n\n", sep = " ")
cat(" HZ :", object@HZ, "\n", sep = " ")
cat(" p-value :", object@p.value, "\n\n", sep = " ")
cat(if(object@p.value > 0.05){" Result : Data is multivariate normal."}
else {" Result : Data is not multivariate normal."},"\n")
cat("---------------------------------------------", "\n\n", sep = " ")
invisible(NULL)
})
setClass("royston",
slots = c(H = "numeric", p.value="numeric", dname="character", dataframe="data.frame"))
setGeneric("royston", function(object) standardGeneric("royston"))
setMethod("show",
signature = "royston",
definition = function(object) {
cat(" Royston's Multivariate Normality Test", "\n", sep = " ")
cat("---------------------------------------------", "\n", sep = " ")
cat(" data :", object@dname, "\n\n", sep = " ")
cat(" H :", object@H, "\n", sep = " ")
cat(" p-value :", object@p.value, "\n\n", sep = " ")
cat(if(object@p.value > 0.05){" Result : Data is multivariate normal."}
else {" Result : Data is not multivariate normal."},"\n")
cat("---------------------------------------------", "\n\n", sep = " ")
invisible(NULL)
})
setClass("dh",
slots = c(TS = "numeric", p.value="numeric", dname="character", dataframe="data.frame"))
setGeneric("dh", function(object) standardGeneric("dh"))
setMethod("show",
signature = "dh",
definition = function(object) {
cat(" Doornick-Hansen's Multivariate Normality Test", "\n", sep = " ")
cat("---------------------------------------------", "\n", sep = " ")
cat(" data :", object@dname, "\n\n", sep = " ")
cat(" DH :", object@TS, "\n", sep = " ")
cat(" p-value :", object@p.value, "\n\n", sep = " ")
cat(if(object@p.value > 0.05){" Result : Data is multivariate normal."}
else {" Result : Data is not multivariate normal."},"\n")
cat("---------------------------------------------", "\n\n", sep = " ")
invisible(NULL)
})
mardiaTest function
mardiaTest <- function (data, cov = TRUE, qqplot = FALSE)
{
dataframe=as.data.frame(data)
dname <- deparse(substitute(data))
data <- as.matrix(data)
n <- dim(data)[1]
p <- dim(data)[2]
data.org <- data
data <- scale(data, scale = FALSE)
if (cov) {
S <- ((n - 1)/n) * cov(data)
}
else {
S <- cov(data)
}
D <- data %*% solve(S) %*% t(data)
g1p <- sum(D^3)/n^2
g2p <- sum(diag((D^2)))/n
df <- p * (p + 1) * (p + 2)/6
k <- (p + 1) * (n + 1) * (n + 3)/(n * ((n + 1) * (p + 1) -
6))
small.skew <- n * k * g1p/6
skew <- n * g1p/6
kurt <- (g2p - p * (p + 2)) * sqrt(n/(8 * p * (p + 2)))
p.skew <- pchisq(skew, df, lower.tail = FALSE)
p.small <- pchisq(small.skew, df, lower.tail = FALSE)
p.kurt <- 2 * (1 - pnorm(abs(kurt)))
if (qqplot) {
d <- diag(D)
r <- rank(d)
chi2q <- qchisq((r - 0.5)/n, p)
#plot(d, chi2q, pch = 19, main = "Chi-Square Q-Q Plot",
# xlab = "Squared Mahalanobis Distance",ylab="Chi-Square Quantile")
#abline(0, 1,lwd = 2, col = "black")
qqPlotPrint = ggplot()+geom_point(aes(d, chi2q),shape=16, size=3)+
geom_abline(intercept =0, slope =1,color="red",size=1)+
xlab("Squared Mahalanobis Distance")+
ylab("Chi-Square Quantile")+
ggtitle("Chi-Square Q-Q Plot")+
theme(plot.title = element_text(lineheight=.8, face="bold"))
print(qqPlotPrint)
}
result <- new("mardia", g1p = g1p, chi.skew = skew, p.value.skew = p.skew,
chi.small.skew = small.skew, p.value.small = p.small, g2p = g2p,
z.kurtosis = kurt, p.value.kurt = p.kurt, dname = dname, dataframe = dataframe)
result
}
Example
library(ggplot2)
data = iris[1:50,1:2]
mardiaTest(data, qqplot=T)
Getting following error:
Error in eval(expr, envir, enclos) : object 'd' not found
Although it is working outside of the function, it is not working inside of it.