Loop lm and msmFit extracting coefficients


Dear all,

I have an xts object with 81 variables. Of these, I need to extract 25 of them with a common string. For each element of this subset I need to do the following estimation, which works for one element (PortAvilliq#). Firstly, a lm, then a msmFit.

Port1 <- lm(PortAvilliq1 ~ 1, data = ger_ts)
# The msmFit
summary(msmPort1 <- msmFit(Port1, 2, sw=rep(TRUE,2)))
# Two variables to determine the greater and smaller coefficients
Port1HighIll <- ifelse(msmPort1@Coef[1,]> msmPort1@Coef[2,],msmPort1@Coef[1,], 
Port1LowIll <- ifelse(msmPort1@Coef[1,] < msmPort1@Coef[2,], msmPort1@Coef[1,],
# The associated probabilities
Port1ProbLow <- ifelse(msmPort1@Coef[1,] > msmPort1@Coef[2,], msmPort1@transMat[2,2],
Port1ProbHigh <- ifelse(msmPort1@Coef[1,] > msmPort1@Coef[2,], msmPort1@transMat[1,1],
# The main variable of interest 
Port1EIll <- Port1LowIll * Port1ProbLow + (Port1HighIll-Port1LowIll) * Port1ProbHigh`

I could workout

myNames <- paste("PortAvilliq", 1:25, sep = "")
myNames <- subset(datager, select = myNames)
mycoefs <- lapply(myNames, function(myNames) mod <-  lm(myNames ~ 1))

However, now I'm stuck as to run the msmFit for each model and then extract coefficients in an array

How can I do it?

Thanks for any help


I think you're pretty close. If you create a function for doing the estimation, then you're just a few steps from getting your result.

I'm assuming you're using the package MSwM. Also, I don't have access to your data, so I'm using the energy data set included in MSwM.


I removed the prefix Port1 and the suffix Ill from your code and created a function that takes a model and extracts the relevant values as a named vector.

get_coeff <- function(msm) {
  # Two variables to determine the greater and smaller coefficients
  High <- ifelse(msm@Coef[1,]> msm@Coef[2,],msm@Coef[1,], 
  Low <- ifelse(msm@Coef[1,] < msm@Coef[2,], msm@Coef[1,],
  # The associated probabilities
  ProbLow <- ifelse(msm@Coef[1,] > msm@Coef[2,], msm@transMat[2,2],
  ProbHigh <- ifelse(msm@Coef[1,] > msm@Coef[2,], msm@transMat[1,1],
  # The main variable of interest 
  E <- Low * ProbLow + (High-Low) * ProbHigh
  c(High = High, 
    Low = Low,
    ProbHigh = ProbHigh,
    ProbLow = ProbLow,
    E = E

In the following section, I create a vector of variable names, which I convert them into a list of formulas, which I then I use to create a list of linear models. From this, I use lapply to create a list of msm models, from which I apply the function above, which gives me a list coefficient vectors.

vars <- c("Oil", "Gas", "Coal")
forms <- lapply(vars, function(v) as.formula(paste(v, '~ 1')))
lm_mods <- lapply(forms, function(f) lm(f, data = energy))
ms_mods <- lapply(lm_mods, function(m) msmFit(m, 2, sw = rep(TRUE,2)))
ms_coeff <- lapply(ms_mods, get_coeff)

The last step is to give each vector a name. This allows us to create a dataframe, which can be converted to a matrix.

names(ms_coeff) <- vars