How can I use try catch for nls function in R - r
I am doing a regression for a Quadric Linear function. I got two option is to use either nlsLM and nls2. However, for some dataset, the use of nlsLM casing some problem such as: singular gradient matrix at initial parameter estimates or they ran in to an infinitie loop. I want to use the try catch to deal with this issue. Can anyone help me out? Thanks everyone in advance.
Here is the full code:
# Packages needed for estimaton of Ideal trajectory - nonlinear regression
#-------------------------------------------------------------------------------
library("minpack.lm")
library("nlstools")
library("nlsMicrobio")
library("stats")
library("tseries") #runs test for auto correlation
#Use NLS2
library(proto)
library(nls2)
################################################################
# Set working directory
setwd("C:/Users/Kevin Le/PycharmProjects/Pig Data Black Box - Copy")
#load dataset
load("Data/JRPData_TTC.Rdata") #load dataset created in MissingData.step
ID <- 5470
#Create a new dataframe which will store Data after ITC estimation
#Dataframe contains ITC parameters
ITC.param.pos2 <- data.frame(ANIMAL_ID=factor(),
X0=double(),
Y1=double(),
Y2=double(),
Ylast=double(),
a=double(),
b=double(),
c=double(),
d=double(),
stringsAsFactors=FALSE)
#Dataframe contains data points on the ITC
Data.remain <- data.frame(ANIMAL_ID=character(),
Age=double(),
obs.CFI=double(),
tt=double(),
ttt=double(),
stringsAsFactors=FALSE)
#===============================================================
# For loop for automatically estimating ITC of all pigs
#===============================================================
IDC <- seq_along(ID) # 17, 23, 52, 57, 116
for (idc in IDC){
# idc = 1
i <- ID[idc]
Data <- No.NA.Data.1[No.NA.Data.1$ANIMAL_ID == i,]
idc1 <- unique(as.numeric(Data$idc.1))
####### Create data frame of x (Age) and y (CFI) ########
x <- as.numeric(Data$Age.plot)
Y <- as.numeric(Data$CFI.plot)
Z <- as.numeric(Data$DFI.plot)
Data.xy <- as.data.frame(cbind(x,Y))
#Initial parameteres for parameter estimation
X0.0 <- x[1]
Xlast <- x[length(x)]
##################################################################
# 1. reparametrization CFI at X0 = 0
#function used for reparametrization in MAPLE
# solve({
# 0=a+b*X_0+c*X_0**2,
# DFIs=b+2*c*Xs,CFIs=a+b*Xs+c*Xs**2},
# {a,b,c});
# a = -X0*(2*CFIs*Xs-CFIs*X0-Xs^2*DFIs+Xs*DFIs*X0)/(Xs^2-2*X0*Xs+X0^2)
# b = (-Xs^2*DFIs+DFIs*X0^2+2*CFIs*Xs)/(Xs^2-2*X0*Xs+X0^2)
# c = -(CFIs-Xs*DFIs+X0*DFIs)/(Xs^2-2*X0*Xs+X0^2)
# 2. with the source of the function abcd and pred
##################################################################
#Provide set of initial parameters
Xs.1 <- round(seq(X0.0 + 1, Xlast - 1, len = 30), digits = 0)
X0.1 <- rep(X0.0, length(Xs.1))
DFIs.1 <- NULL
CFIs.1 <- NULL
for(A in seq_along(Xs.1)){
DFIs2 <- Data[Data$Age.plot == Xs.1[A],]$DFI.plot
CFIs2 <- Data[Data$Age.plot == Xs.1[A],]$CFI.plot
DFIs.1 <- c(DFIs.1, DFIs2)
CFIs.1 <- c(CFIs.1, CFIs2)
}
st1 <- data.frame(cbind(X0.1, Xs.1, DFIs.1, CFIs.1))
names(st1) <- c("X0","Xs", "DFIs","CFIs")
#RUN NLS2 to find optimal initial parameters
st2 <- nls2(Y ~ nls.func.2(X0, Xs, DFIs, CFIs),
Data.xy,
start = st1,
# weights = weight,
# trace = T,
algorithm = "brute-force")
par_init <- coef(st2); par_init
#--------------------------------------------
# Create empty lists to store data after loop
#--------------------------------------------
par <- list()
AC.res <- list()
AC.pvalue <- NULL
data2 <- list()
data3 <- list()
param <- data.frame(rbind(par_init))
par.abcd <- data.frame(rbind(abcd.2(as.vector(par_init))))
param.2 <- data.frame(X0=double(),
Xs=double(),
DFIs=double(),
CFIs=double(),
a=double(),
b=double(),
c=double(),
stringsAsFactors=FALSE)
j <- 2
AC_pvalue <- 0
AC.pvalue[1] <- AC_pvalue
datapointsleft <- as.numeric(dim(Data)[1])
dpl <- datapointsleft #vector of all dataponitsleft at each step
#-------------------------------------------------------------------------------
# Start the procedure of Non Linear Regression
#-------------------------------------------------------------------------------
while ((AC_pvalue<=0.05) && datapointsleft >= 20){
weight <- 1/Y^2
# ---------------- NON linear reg applied to log(Y) ---------------------------------
st2 <- nls2(Y ~ nls.func.2(X0, Xs, DFIs, CFIs),
Data.xy,
start = st1,
weights = weight,
trace = F,
algorithm = "brute-force")
par_init <- coef(st2)
par_init
# st1 <- st1[!(st1$Xs == par_init[2]),]
nls.CFI <- nlsLM(Y ~ nls.func.2(X0, Xs, DFIs, CFIs),
Data.xy,
control = list(tol = 1e-2, printEval = TRUE, maxiter = 1024),
start = list(X0 = par_init[1], Xs = par_init[2],
DFIs = par_init[3], CFIs = par_init[4]),
weights = weight,
algorithm = "port",
lower = c(-10000,X0.0+1, -10000, -10000),
upper = c(10000, Xlast-1, 10000, 10000),
trace = F)
# nls.CFI <- nls2(Y ~ nls.func.2(X0, Xs, DFIs, CFIs),
# Data.xy,
# start = list(X0 = par_init[1], Xs = par_init[2],
# DFIs = par_init[3], CFIs = par_init[4]),
# weights = weight,
# control = nls.control(warnOnly = TRUE),
# trace = T,
# algorithm = "port",
# lower = c(-100000000,X0.0+1, -1000000000, -1000000000),
# upper = c(1000000000, Xlast-1, 1000000000, 1000000000))
# nls.CFI <- nlsLM(Y ~ nls.func.2(X0, Xs, DFIs, CFIs),
# Data.xy,
# control = nls.control(warnOnly = TRUE),
# start = list(X0 = par_init[1], Xs = par_init[2],
# DFIs = par_init[3], CFIs = par_init[4]),
# weights = weight,
# algorithm = "port",
# lower = c(-1000000000,X0.0+1, -1000000000, -1000000000),
# upper = c(1000000000, Xlast-1, 1000000000, 1000000000),
# trace = F)
#--------RESULTS analysis GOODNESS of fit
#estimate params
par[[j]] <- coef(nls.CFI)
par.abcd[j,] <- abcd.2(as.vector(coef(nls.CFI) )) #calculation of a, b, c and d
param[j,] <- par[[j]]
param.2[j-1,] <- cbind(param[j,], par.abcd[j,])
#summary
# summ = overview((nls.CFI)) #summary
#residuals
res1 <- nlsResiduals(nls.CFI) #residuals
res2 <- nlsResiduals(nls.CFI)$resi1
res <- res2[, 2]
AC.res <- test.nlsResiduals(res1)
AC.pvalue[j] <- AC.res$p.value
#---------Check for negative residuals----------
#Add filtration step order to data
Step <- rep(j - 1, length(x))
#create a new dataset with predicted CFI included
Data.new <- data.frame(cbind(x, Z, Y, pred.func.2(par[[j]],x)[[1]], res, Step))
names(Data.new) <- c("Age", "Observed_DFI","Observed_CFI", "Predicted_CFI", "Residual", "Step")
# plot(Data.new$Age, Data.new$Predicted_CFI, type = "l", col = "black",lwd = 2,
# ylim = c(0, max(Data.new$Predicted_CFI, Data.new$Observed_CFI)))
# lines(Data.new$Age, Data.new$Observed_CFI, type = "p", cex = 1.5)
#
#remove negative res
Data.pos <- Data.new[!Data.new$Residual<0,]
# lines(Data.pos$Age, Data.pos$Predicted_CFI, type = "l", col = j-1, lwd = 2)
# lines(Data.pos$Age, Data.pos$Observed_CFI, type = "p", col = j, cex = 1.5)
#restart
#Criteria to stop the loop when the estimated parameters are equal to initial parameters
# Crite <- sum(param.2[dim(param.2)[1],c(1:4)] == par_init)
datapointsleft <- as.numeric(dim(Data.pos)[1])
par_init <- par[[j]]
AC_pvalue <- AC.pvalue[j]
j <- j+1
x <- Data.pos$Age
Y <- Data.pos$Observed_CFI
Z <- Data.pos$Observed_DFI
Data.xy <- as.data.frame(cbind(x,Y))
dpl <- c(dpl, datapointsleft)
dpl
#Create again the grid
X0.0 <- x[1]
Xlast <- x[length(x)]
#Xs
if(par_init[2] -15 <= X0.0){
Xs.1 <- round(seq(X0.0 + 5, Xlast - 5, len = 30), digits = 0)
} else if(par_init[2] + 5 >= Xlast){
Xs.1 <- round(seq(par_init[2]-10, par_init[2]-1, len = 6), digits = 0)
} else{
Xs.1 <- round(seq(par_init[2]-5, par_init[2] + 5, len = 6), digits = 0)
}
#
X0.1 <- rep(X0.0, length(Xs.1))
DFIs.1 <- NULL
CFIs.1 <- NULL
for(A in seq_along(Xs.1)){
DFIs2 <- Data[Data$Age.plot == Xs.1[A],]$DFI.plot
CFIs2 <- Data[Data$Age.plot == Xs.1[A],]$CFI.plot
DFIs.1 <- c(DFIs.1, DFIs2)
CFIs.1 <- c(CFIs.1, CFIs2)
}
st1 <- data.frame(cbind(X0.1, Xs.1, DFIs.1, CFIs.1))
if(X0.0 <= par_init[2] && Xlast >=par_init[2]){
st1 <- rbind(st1, par_init)
}
names(st1) <- c("X0","Xs", "DFIs","CFIs")
}
} # end FOR loop
Here is the data file. I have exported my data into the .Rdata for an easier import.: https://drive.google.com/file/d/1GVMarNKWMEyz-noSp1dhzKQNtu2uPS3R/view?usp=sharing
In this file, the set id: 5470 will have this error: singular gradient matrix at initial parameter estimates in this part:
nls.CFI <- nlsLM(Y ~ nls.func.2(X0, Xs, DFIs, CFIs),
Data.xy,
control = list(tol = 1e-2, printEval = TRUE, maxiter = 1024),
start = list(X0 = par_init[1], Xs = par_init[2],
DFIs = par_init[3], CFIs = par_init[4]),
weights = weight,
algorithm = "port",
lower = c(-10000,X0.0+1, -10000, -10000),
upper = c(10000, Xlast-1, 10000, 10000),
trace = F)
The complementary functions (file Function.R):
abcd.2 <- function(P){
X0 <- P[1]
Xs <- P[2]
DFIs <- P[3]
CFIs <- P[4]
a <- -X0*(2*CFIs*Xs-CFIs*X0-Xs^2*DFIs+Xs*DFIs*X0)/(Xs^2-2*X0*Xs+X0^2)
b <- (-Xs^2*DFIs+DFIs*X0^2+2*CFIs*Xs)/(Xs^2-2*X0*Xs+X0^2)
c <- -(CFIs-Xs*DFIs+X0*DFIs)/(Xs^2-2*X0*Xs+X0^2)
pp <- as.vector(c(a, b, c))
return(pp)
}
#--------------------------------------------------------------
# NLS function
#--------------------------------------------------------------
nls.func.2 <- function(X0, Xs, DFIs, CFIs){
pp <- c(X0, Xs, DFIs, CFIs)
#calculation of a, b and c using these new parameters
c <- abcd.2(pp)[3]
b <- abcd.2(pp)[2]
a <- abcd.2(pp)[1]
ind1 <- as.numeric(x < Xs)
return (ind1*(a+b*x+c*x^2)+(1-ind1)*((a+b*(Xs)+c*(Xs)^2)+(b+2*c*(Xs))*(x-(Xs))))
}
#--------------------------------------------------------------
# Fit new parameters to a quadratic-linear function of CFI
#--------------------------------------------------------------
pred.func.2 <- function(pr,age){
#
X0 <- pr[1]
Xs <- pr[2]
DFIs <- pr[3]
CFIs <- pr[4]
#
x <- age
#calculation of a, b and c using these new parameters
c <- abcd.2(pr)[3]
b <- abcd.2(pr)[2]
a <- abcd.2(pr)[1]
#
ind1 <- as.numeric(x < Xs)
#
results <- list()
cfi <- ind1*(a+b*x+c*x^2)+(1-ind1)*((a+b*(Xs)+c*(Xs)^2)+(b+2*c*(Xs))*(x-(Xs))) #CFI
dfi <- ind1*(b+2*c*x) + (1 - ind1)*(b+2*c*(Xs)) #DFI
results[[1]] <- cfi
results[[2]] <- dfi
return (results)
}
#---------------------------------------------------------------------------------------------------------------
# Quadratic-linear function of CFI curve and its 1st derivative (DFI) with original parameters (only a, b and c)
#---------------------------------------------------------------------------------------------------------------
pred.abcd.2 <- function(pr,age){
#
a <- pr[1]
b <- pr[2]
c <- pr[3]
x <- age
#calculation of a, b and c using these new parameters
#
ind1 <- as.numeric(x < Xs)
#
results <- list()
cfi <- ind1*(a+b*x+c*x^2)+(1-ind1)*((a+b*(Xs)+c*(Xs)^2)+(b+2*c*(Xs))*(x-(Xs))) #CFI
dfi <- ind1*(b+2*c*x) + (1 - ind1)*(b+2*c*(Xs)) #DFI
results[[1]] <- cfi
results[[2]] <- dfi
return (results)
}
Updated: I did review my logic from the previous step and found that my data is a bit messed up because of it. I have fixed it. The case where a set f data ran into an infinite loop has no longer exists, but this error is still there however: singular gradient matrix at initial parameter estimates.
Related
nls.lm Data not found?
require(deSolve) require(reshape2) require(ggplot2) library(minpack.lm) # library for least squares fit using levenberg-marquart algorithm N = 10000000 delta1=0.005 sigma1=0.15 #initial value of population 5 states initial_state_values <- c(S = 1634485, V = 6300185, E = 701660, I = 637873, R = 616197) #initial parameters parameters <- c(beta1 = 0.0000000001, alpha1 = 0.1, gamma1 = 0.33, kappa1 = 0.0022) #time intervals for specific period of days time <- seq(from = 1, to = 60, by = 0.1) #to have a detailed solution, I've specified time #plot observed data data <- read.csv("observeddata3acc.csv") tmp = melt(data,id.vars=c("time"),variable.name="States",value.name="Number_of_individuals") ggplot(data=tmp, aes(x=time, y=Number_of_individuals, color=States)) + geom_line(size=1) # Input function: from the Differential equations that we have SVEIR_fn <- function(time, initial_state_values, parameters) { with(as.list(c(initial_state_values, parameters)), { N <- S+V+E+I+R dS <- delta1*R - kappa1*S-beta1*S*I/N dV <- kappa1*S - beta1*sigma1*V*I/N dE <- beta1*S*I/N + beta1*V*sigma1*I/N -gamma1*E dI <- gamma1*E - I*alpha1 dR <- alpha1*I - delta1*R return(list(c(dS, dV, dE, dI, dR))) }) } result <- as.data.frame(ode(y = initial_state_values, times = time, func = SVEIR_fn, parms = parameters) ) result result$total_prevalenceI <- result$I result$total_prevalenceR <- result$R result$total_prevalenceS <- result$S result$total_prevalenceE <- result$E result$total_prevalenceV <- result$V # Distance Function measured with data data <- read.csv("observeddata3acc.csv") SVEIR_SSQ <- function(parameters, data) { result <- as.data.frame(ode(y = initial_state_values, times = time, func = SVEIR_fn, parms = parameters) ) result$total_prevalenceI <- result$I result$total_prevalenceR <- result$R result$total_prevalenceS <- result$S result$total_prevalenceE <- result$E result$total_prevalenceV <- result$V deltas_squareI <- (result$total_prevalenceI[result$time %in% data$time] - data$II)^2 deltas_squareR <- (result$total_prevalenceR[result$time %in% data$time] - data$RR)^2 deltas_squareS <- (result$total_prevalenceS[result$time %in% data$time] - data$SS)^2 deltas_squareE <- (result$total_prevalenceE[result$time %in% data$time] - data$EE)^2 deltas_squareV <- (result$total_prevalenceV[result$time %in% data$time] - data$VV)^2 SSQ <- sum(deltas_squareI+deltas_squareR+deltas_squareS+deltas_squareE+deltas_squareV) return(SSQ) } SSQ #fivalue=nls.lm(par=c(beta1 = 0.0000000001, alpha1 = 0.1, gamma1 = 0.33, kappa1 = 0.0022), `enter code here`fn=SVEIR_SSQ) fitval=nls.lm(par=parms,lower=c(0.000000001, 1/15, 1/5, 0.0011), upper=c(1.0, 1/7 , 1/2, `enter code here`0.05), fn=SVEIR_SSQ, data) I couldn't get output or result due to the error: Error in result$time %in% data$time : argument "data" is missing, with no default How to solve the issue and could I use melt function my function to be optimized is the square of residuals (difference between the observed and simulated ones. Regads
Calculate stderr, t-value, p-value, predict value for linear regression
I'm fitting linear models with MatrixModels:::lm.fit.sparse and MatrixModels::glm4 (also sparse). However, these functions return coeff, residuals and fitted.values only. What's the fastest and easiest way to get/calculate another values such as stderr, t-value, p-value, predict value?
I use the data from MatrixModels:::lm.fit.sparse example. I built a custom function summary_sparse to perform a summary for this model. All matrix operations are performed with Matrix package. Results are compared with dense type model. Note lm.fit.sparse have to be evaluated with method = "chol" to get proper results. Functions: summary_sparse <- function(l, X) { XXinv <- Matrix::chol2inv(Matrix::chol(Matrix::crossprod(X))) se <- sqrt(Matrix::diag(XXinv*sum(l$residuals**2)/(nrow(X)-ncol(X)))) ts <- l$coef/se pvals <- 2*c(1 - pnorm(abs(ts))) list(coef = l$coef, se = se, t = ts, p = pvals) } predict_sparse <- function(X, coef) { X %*% coef } Application: dd <- expand.grid(a = as.factor(1:3), b = as.factor(1:4), c = as.factor(1:2), d= as.factor(1:8)) n <- nrow(dd <- dd[rep(seq_len(nrow(dd)), each = 10), ]) set.seed(17) dM <- cbind(dd, x = round(rnorm(n), 1)) ## randomly drop some n <- nrow(dM <- dM[- sample(n, 50),]) dM <- within(dM, { A <- c(2,5,10)[a] B <- c(-10,-1, 3:4)[b] C <- c(-8,8)[c] D <- c(10*(-5:-2), 20*c(0, 3:5))[d] Y <- A + B + A*B + C + D + A*D + C*x + rnorm(n)/10 wts <- sample(1:10, n, replace=TRUE) rm(A,B,C,D) }) X <- Matrix::sparse.model.matrix( ~ (a+b+c+d)^2 + c*x, data = dM) Xd <- as(X,"matrix") fmDense <- lm(dM[,"Y"]~Xd-1) ss <- summary(fmDense) r1 <- MatrixModels:::lm.fit.sparse(X, y = dM[,"Y"], method = "chol") f <- summary_sparse(r1, X) all.equal(do.call(cbind, f), ss$coefficients, check.attributes = F) #TRUE all.equal(predict_sparse(X, r1$coef)#x, predict(fmDense), check.attributes = F, check.names=F) #TRUE
why random effect estiamator are not correct
I'm trying to simulate glmmLasso using a binomial data. but random effect estiamator are not similar 5 that i given. something wrong in my code? if not, why random effect shown like that. makedata <- function(I, J, p, sigmaB){ N <- I*J # fixed effect generation beta0 <- runif(1, 0, 1) beta <- sort(runif(p, 0, 1)) # x generation x <- matrix(runif(N*p, -1, 1), N, p) # random effect generation b0 <- rep(rnorm(I, 0, sigmaB), each=J) # group group <- as.factor(rep(1:I, each = J)) # y generation k <- exp(-(beta0 + x %*% beta + b0)) y <- rbinom(n = length(k), size = 1, prob = (1/(1+k))) #standardization sx <- scale(x, center = TRUE, scale = TRUE) simuldata <- data.frame(y = y, x = sx, group) res <- list(simuldata=simuldata) return(res) } # I : number of groups I <- 20 # J : number of observation in group J <- 10 # p : number of variables p <- 20 # sigmaB : sd of random effect b0 sigmaB <- 5 set.seed(231233) simdata <- makedata(I, J, p, sigmaB) lam <- 10 xnam <- paste("x", 1:p, sep=".") fmla <- as.formula(paste("y ~ ", paste(xnam, collapse= "+"))) glmm <- glmmLasso(fmla, rnd = list(group=~1), data = simdata, lambda = lam, control = list(scale = T, center = T)) summary(glmm)
Objective function in optim evaluates to length 3 not 1
I am new to R and trying to find the optimal values of 3 parameters via indirect inference from a simulated panel data set, but getting an error "objective function in optim evaluates to length 3 not 1". I tried to check past posts, but the one I found didn't address the problem I am facing. The code works if I only try for one parameter instead of 3. Here is the code: #Generating data modelp <- function(Y,alpha,N,T){ Yt <- Y[,2:T] Ylag <- Y[,1:(T-1)] Alpha <- alpha[,2:T] yt <- matrix(t(Yt), (T-1)*N, 1) ylag <- matrix(t(Ylag), (T-1)*N, 1) alph <- matrix(t(Alpha), (T-1)*N, 1) rho.ind <- rep(NA,N) sigma_u <- rep(NA,N) sigma_a <- rep(NA,N) for(n in 1:N){ sigma_u[n] <- sigma(lm(yt~alph+ylag)) sigma_a[n] <- lm(yt~alph+ylag)$coef[2] # (diag(vcov((lm(yt~alph+ylag)$coef),complete=TRUE)))[2] # rho.ind[n] <- lm(yt~alph+ylag)$coef[3] } param <- matrix(NA,1,3) param[1]<- mean(sum(rho.ind)) param[2]<- mean(sum(sigma_u)) param[3]<- mean(sum(sigma_a)) return(param) } ## Function to estimate parameters H.theta <- function(param.s){ set.seed(tmp.seed) #set seed param.s.tmp <- matrix(0,1,3) for(s in 1:H){ eps.s <- matrix(rnorm(N*T), N, T) #white noise erros eps0.s <- matrix(rnorm(N*T), N, 1) #error for initial condition alph.s <- matrix(rnorm(N*T),N,T) Y.s <- matrix( 0, N, T) ys.lag <- eps0.s for(t in 1:T){ #Simulating the AR(1) process data ys <- alph.s[,t]+param.s[1] * ys.lag + eps.s[,t] # [n,1:t] Y.s[,t] <- ys ys.lag <- ys } param.s.tmp <- param.s.tmp + modelp(Y.s, alph.s,N, T) param.s[2] <- param.s.tmp[2] param.s[3] <- mean(var(alph.s)) #param.s.tmp[3] } return( (param.data - param.s.tmp/H)^2 ) #return(param.s[1]) } #Results for T = 10 & H = 10, N=100 nrep <-10 rho <-0.9 sigma_u <- 1 sigma_a <- 1.5 param <- matrix(NA,1,3) param[1] <- rho param[2] <- sigma_u param[3] <- sigma_u s.mu <- 0 # Mean s.ep <- 0.5 #White Noise -initial conditions Box <- cbind(rep(100,1),c(20),rep(c(5),1)) r.simu.box <- matrix(0,nrep,nrow(Box)) r.data.box <- matrix(0,nrep,nrow(Box)) for(k in 1:nrow(Box)){ N <- Box[k,1] #Number of individuals in panel T <- Box[k,2] #Length of Panel H <- Box[k,3] # Number of simulation paths p.data <-matrix(NA,nrep,3) p.simu <-matrix(NA,nrep,3) est <- matrix(NA,1,3) for(i in 1:nrep){ mu <- matrix(rnorm(N )*s.mu, N, 1) eps <- matrix(rnorm(N*T)*s.ep, N, T) eps0 <- matrix(rnorm(N*T)*s.ep, N, 1) alph <- matrix(rnorm(N ), N, T) Y <- matrix( 0, N, T) y.lag <- (1-param[1])*mu + eps0 for(t in 1:T){ y <- alph[,t]+param[1]*y.lag +eps[,t] Y[,t] <- y y.lag <- y } param.data <- modelp(Y,alph,N,T) #Actual data p.data[i,1:3] <- param.data tmp.seed <- 3864+i+100*(k-1) #Simulated data x0 <- c(0.5, 0,0) est[i] <- optim(x0, H.theta,method = "BFGS", hessian = TRUE)$par p.simu[i,1:3] <- est[i] if(i%%10==0) print(c("Finished the (",i,")-th replication")) } } mean(p.data[,1])- mean(p.simu[,1]) mean(p.data[,2])- mean(p.simu[,2]) sqrt(mean((p.data[1]-p.simu[1])^2)) I expect to get three values. Any help or suggestion will be greatly appreciated.
Error in R-script: error in abs (alpha) non-numeric argument to mathematical function
I am trying to reproduce some results from the book "Financial Risk Modelling and Portfolio Optimisation with R" and I get an error that I can't seem to get my head around. I get the following error in the COPPosterior function: error in abs(alpha) : non-numeric argument to mathematical function Is anyone able to see why I get the error? The error is from the following script: library(urca) library(vars) library(fMultivar) ## Loading data set and converting to zoo data(EuStockMarkets) Assets <- as.zoo(EuStockMarkets) ## Aggregating as month-end series AssetsM <- aggregate(Assets, as.yearmon, tail, 1) head(AssetsM) ## Applying unit root tests for sub-sample AssetsMsub <- window(AssetsM, start = start(AssetsM), end = "Jun 1996") ## Levels ADF <- lapply(AssetsMsub, ur.df, type = "drift", selectlags = "AIC") ERS <- lapply(AssetsMsub, ur.ers) ## Differences DADF <- lapply(diff(AssetsMsub), ur.df, selectlags = "AIC") DERS <- lapply(diff(AssetsMsub), ur.ers) ## VECM VEC <- ca.jo(AssetsMsub, ecdet = "none", spec = "transitory") summary(VEC) ## Index of time stamps in back test (extending window) idx <- index(AssetsM)[-c(1:60)] ANames <- colnames(AssetsM) NAssets <- ncol(AssetsM) ## Function for return expectations f1 <- function(x, ci, percent = TRUE){ data <- window(AssetsM, start = start(AssetsM), end = x) Lobs <- t(tail(data, 1)) vec <- ca.jo(data, ecdet = "none", spec = "transitory") m <- vec2var(vec, r = 1) fcst <- predict(m, n.ahead = 1, ci = ci) LU <- matrix(unlist(fcst$fcst), ncol = 4, byrow = TRUE)[, c(2, 3)] RE <- rep(0, NAssets) PView <- LU[, 1] > Lobs NView <- LU[, 2] < Lobs RE[PView] <- (LU[PView, 1] / Lobs[PView, 1] - 1) RE[NView] <- (LU[NView, 1] / Lobs[NView, 1] - 1) names(RE) <- ANames if(percent) RE <- RE * 100 return(RE) } ReturnEst <- lapply(idx, f1, ci = 0.5) qv <- zoo(matrix(unlist(ReturnEst), ncol = NAssets, byrow = TRUE), idx) colnames(qv) <- ANames tail(qv) library(BLCOP) library(fPortfolio) ## Computing returns and EW-benchmark returns R <- (AssetsM / lag(AssetsM, k = -1) -1.0) * 100 ## Prior distribution ## Fitting of skewed Student's t distribution MSTfit <- mvFit(R, method = "st") mu <- c(MSTfit#fit[["beta"]]) S <- MSTfit#fit[["Omega"]] skew <- c(MSTfit#fit[["alpha"]]) df <- MSTfit#fit[["df"]] CopPrior <- mvdistribution("mvst", dim = NAssets, mu = mu, Omega = S, alpha = skew, df = df) ## Pick matrix and view distributions for last forecast RetEstCop <- ReturnEst[[27]] RetEstCop PCop <- matrix(0, ncol = NAssets, nrow = 3) colnames(PCop) <- ANames PCop[1, ANames[1]] <- 1 PCop[2, ANames[2]] <- 1 PCop[3, ANames[4]] <- 1 Sds <- apply(R, 2, sd) RetViews <- list(distribution("norm", mean = RetEstCop[1], sd = Sds[1]), distribution("norm", mean = RetEstCop[2], sd = Sds[2]), distribution("norm", mean = RetEstCop[4], sd = Sds[4]) ) CopViews <- COPViews(pick = PCop, viewDist = RetViews, confidences = rep(0.5, 3), assetNames = ANames) ## Simulation of posterior NumSim <- 10000 CopPost <- COPPosterior(CopPrior, CopViews, numSimulations = NumSim) print(CopPrior) print(CopViews) slotNames(CopPost)
look at the structure of MSTfit: str(MSTfit) You can see that if you want the estimated alpha value, you need to access it via: MSTfit#fit$estimated[['alpha']] rather than MSTfit#fit[['alpha']]