Simrit Rattan
2019-Apr-01 10:37 UTC
[R] Fwd: Error message: object of type 'closure' is not subsettable
hey everyone :),
Subject: Re: Error message: object of type 'closure' is not subsettable
I am writing a package which should calculate the binary logistic
regression.
The function itself work perfectly, but if I want to load the function from
my package it gives me the above mentioned error. I have tried a lot of
things, googled and so on, but I can not figure out what to change so it
works. I also found out the mistake lies in the first function
(logisticRegression)
logisticRegression <- function(x,y, threshold = 1e-10, maxIter = 100)
{
calcPi <- function(x,betaCoef)
{
betaCoef <- as.matrix(betaCoef)
return(exp(x%*%betaCoef)/(1 + exp(x%*%betaCoef)))
}
#initial guess for beta (mostly we start with 0)
betaCoef <- rep(0, ncol(x))
#some initial value which is bigger than the threshold for the loop
initialValue <- 10000
#count of iteration to make sure its not an infinite loop
iterCount <- 0
#iteration process (loop)
while(initialValue > threshold) #convergence test
{
#calculates probabilities using the current estimate of beta
p <- as.vector(calcPi(x, betaCoef))
#calculates W which is needed for the Hessian
W <- diag(p*(1-p))
#calculates the gradient
gradient <- t(x)%*%(y-p)
#calculates the hessian
hessian <- -(t(x)%*%W)%*%x
#calculates beta
betaCoef <- betaCoef - solve(hessian) %*% gradient
#how much did we change beta?
initialValue <- sum((solve(hessian) %*% gradient)^2)
#to see if we reached the max # of iteration
iterCount <- iterCount + 1
if(iterCount > maxIter) {
stop("This is not converging")
}
}
#df
Totaldf <- length(y) - 1
Residualdf <- length(y) - length(betaCoef)
degreesOfFreedom <- cbind(Totaldf, Residualdf)
#fisher information, variance, standard error
fisherInformation <- -hessian
vCov <- solve(fisherInformation)
stdError <- sqrt(diag(vCov))
#wald test statistic
waldTestStatistic <- betaCoef/stdError
pValue <- 2 * pnorm(-abs(waldTestStatistic), mean = 0, sd = 1)
#loglikelihood and deviance
logLikelihoodFunction <- y%*%x%*%betaCoef - sum(log(1+exp(x%*%betaCoef)))
residualDeviance <- -2*logLikelihoodFunction
#AIC
akaikeIC <- residualDeviance + 2*ncol(betaCoef)
#for R2
cV <- 2/nrow(x) #for C&S R2
#deviance residual
sign1 <- replace(y, y == 0, -1)
devianceResiduals <- sign1*sqrt(-2*(y*log(p) + (1-y)*log(1-p)))
residualQuantiles <- summary(devianceResiduals)
#fitted values
fittedValues <- log(p/(1-p))
#what to return
coefficients <- betaCoef
output <- list()
output$degreesF <- Residualdf
output$nulldf <- Totaldf
output$fittedValues <- fittedValues
output$devianceResiduals <- devianceResiduals
output$residualQuantiles <- residualQuantiles
output$coefficients <- coefficients
output$vCov <- vCov
output$coefMat <- cbind(coefficients,
stdError,
waldTestStatistic,
pValue)
colnames(output$coefMat) <- c("Estimate",
"Std.Err",
"z value",
"Pr(>|z|)")
output$logLikelihoodFunction <- logLikelihoodFunction
output$residualDeviance <- residualDeviance
output$akaikeIC <- akaikeIC
output$iterCount <- iterCount -1
output$p <- p
output$cV <- cV
output
}
logReg <- function(formula, data) {
x <- model.matrix(formula, data)
regressant <- model.frame(formula, data)
y <- regressant[,1]
constant <- matrix(rep(1, length(y)))
nulllog <- logisticRegression(constant,y)
nullDeviance <- nulllog$residualDeviance
nullLogLikelihood <- nulllog$logLikelihoodFunction
output <- list()
output <- logisticRegression(x,y)
output$formula <- formula
output$nullDeviance <- nullDeviance
output$nullLogLikelihood <- nullLogLikelihood
output$call <- match.call()
#define the S3 class
class(output) <- "logReg"
print(output)
}
logReg.default <- function(x, ...) UseMethod("logReg")
print.logReg <- function(x, ...) {
cat("\nCall:\n")
print(x$call)
cat("\nCoefficients:\n")
colnames(x$coefficients) <- ""
print(t(x$coefficients), digits = 5)
cat("\nDegrees of Freedom:",
paste(x$nulldf, "Total (i.e. Null);", x$degreesF,
"Residual"))
cat("\nNull Deviance:", paste(round(x$nullDeviance, digits = 2)))
cat("\nResidual Deviance:", paste(round(x$residualDeviance, digits =
2)))
invisible(x)
}
Thanks for your help! :D
--
Sent from: http://r.789695.n4.nabble.com/R-help-f789696.html
[[alternative HTML version deleted]]
Eric Berger
2019-Apr-01 14:53 UTC
[R] Fwd: Error message: object of type 'closure' is not subsettable
You may be calling a function when you think you are referring to an array.
You can reproduce this error message as follows:
f <- function(x) {x}
f[1]
HTH,
Eric
On Mon, Apr 1, 2019 at 5:49 PM Simrit Rattan <simrit.rattan at gmail.com>
wrote:
> hey everyone :),
> Subject: Re: Error message: object of type 'closure' is not
subsettable
> I am writing a package which should calculate the binary logistic
> regression.
> The function itself work perfectly, but if I want to load the function from
> my package it gives me the above mentioned error. I have tried a lot of
> things, googled and so on, but I can not figure out what to change so it
> works. I also found out the mistake lies in the first function
> (logisticRegression)
>
> logisticRegression <- function(x,y, threshold = 1e-10, maxIter = 100)
> {
> calcPi <- function(x,betaCoef)
> {
> betaCoef <- as.matrix(betaCoef)
> return(exp(x%*%betaCoef)/(1 + exp(x%*%betaCoef)))
> }
> #initial guess for beta (mostly we start with 0)
> betaCoef <- rep(0, ncol(x))
>
> #some initial value which is bigger than the threshold for the loop
> initialValue <- 10000
>
> #count of iteration to make sure its not an infinite loop
> iterCount <- 0
>
> #iteration process (loop)
> while(initialValue > threshold) #convergence test
> {
> #calculates probabilities using the current estimate of beta
> p <- as.vector(calcPi(x, betaCoef))
>
> #calculates W which is needed for the Hessian
> W <- diag(p*(1-p))
>
> #calculates the gradient
> gradient <- t(x)%*%(y-p)
>
> #calculates the hessian
> hessian <- -(t(x)%*%W)%*%x
>
> #calculates beta
> betaCoef <- betaCoef - solve(hessian) %*% gradient
>
> #how much did we change beta?
> initialValue <- sum((solve(hessian) %*% gradient)^2)
>
> #to see if we reached the max # of iteration
> iterCount <- iterCount + 1
> if(iterCount > maxIter) {
> stop("This is not converging")
>
> }
> }
> #df
> Totaldf <- length(y) - 1
> Residualdf <- length(y) - length(betaCoef)
> degreesOfFreedom <- cbind(Totaldf, Residualdf)
> #fisher information, variance, standard error
> fisherInformation <- -hessian
> vCov <- solve(fisherInformation)
> stdError <- sqrt(diag(vCov))
>
> #wald test statistic
> waldTestStatistic <- betaCoef/stdError
> pValue <- 2 * pnorm(-abs(waldTestStatistic), mean = 0, sd = 1)
>
> #loglikelihood and deviance
> logLikelihoodFunction <- y%*%x%*%betaCoef -
> sum(log(1+exp(x%*%betaCoef)))
> residualDeviance <- -2*logLikelihoodFunction
>
> #AIC
> akaikeIC <- residualDeviance + 2*ncol(betaCoef)
> #for R2
> cV <- 2/nrow(x) #for C&S R2
>
> #deviance residual
> sign1 <- replace(y, y == 0, -1)
> devianceResiduals <- sign1*sqrt(-2*(y*log(p) + (1-y)*log(1-p)))
> residualQuantiles <- summary(devianceResiduals)
>
> #fitted values
> fittedValues <- log(p/(1-p))
> #what to return
> coefficients <- betaCoef
> output <- list()
> output$degreesF <- Residualdf
> output$nulldf <- Totaldf
> output$fittedValues <- fittedValues
> output$devianceResiduals <- devianceResiduals
> output$residualQuantiles <- residualQuantiles
> output$coefficients <- coefficients
> output$vCov <- vCov
> output$coefMat <- cbind(coefficients,
> stdError,
> waldTestStatistic,
> pValue)
> colnames(output$coefMat) <- c("Estimate",
> "Std.Err",
> "z value",
> "Pr(>|z|)")
> output$logLikelihoodFunction <- logLikelihoodFunction
> output$residualDeviance <- residualDeviance
> output$akaikeIC <- akaikeIC
> output$iterCount <- iterCount -1
> output$p <- p
> output$cV <- cV
> output
>
>
> }
>
> logReg <- function(formula, data) {
> x <- model.matrix(formula, data)
> regressant <- model.frame(formula, data)
> y <- regressant[,1]
> constant <- matrix(rep(1, length(y)))
> nulllog <- logisticRegression(constant,y)
> nullDeviance <- nulllog$residualDeviance
> nullLogLikelihood <- nulllog$logLikelihoodFunction
>
> output <- list()
> output <- logisticRegression(x,y)
> output$formula <- formula
> output$nullDeviance <- nullDeviance
> output$nullLogLikelihood <- nullLogLikelihood
> output$call <- match.call()
>
> #define the S3 class
>
> class(output) <- "logReg"
> print(output)
>
> }
>
> logReg.default <- function(x, ...) UseMethod("logReg")
>
> print.logReg <- function(x, ...) {
> cat("\nCall:\n")
> print(x$call)
> cat("\nCoefficients:\n")
> colnames(x$coefficients) <- ""
> print(t(x$coefficients), digits = 5)
> cat("\nDegrees of Freedom:",
> paste(x$nulldf, "Total (i.e. Null);", x$degreesF,
"Residual"))
> cat("\nNull Deviance:", paste(round(x$nullDeviance, digits =
2)))
> cat("\nResidual Deviance:", paste(round(x$residualDeviance,
digits = 2)))
> invisible(x)
> }
>
> Thanks for your help! :D
>
>
>
>
> --
> Sent from: http://r.789695.n4.nabble.com/R-help-f789696.html
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
[[alternative HTML version deleted]]