I have a function for fitting a type of linear regression and have written 
methods for it as shown below. I exclude the main lm.eiv.fit function as it is 
large and I don't think necessary for the reproducible example. But, I can 
certainly provide if that would be needed.

These methods allow for the normal formula interface with the function and some 
of the other common methods (e.g., subset). One thing I cannot figure out is 
how to allow the argument semMat in the function to recognize the variable can 
also be in the dataframe "dat".

When I call the function as follows everything is just fine.

fm <- lm.eiv(y ~ x1 + x2, dat, ind = c(2,3), semDep = 0, semMat = 
cbind(dat$sem1, dat$sem2))

However, if I were to use the following instead such that I do not specify that 
both sem1 and sem2 are in the dataframe 'dat',

fm <- lm.eiv(y ~ x1 + x2, dat, ind = c(2,3), semDep = 0, semMat = cbind(sem1, 
sem2))
Error in as.matrix(semMat) :
  error in evaluating the argument 'x' in selecting a method for function 
'as.matrix': Error in cbind(sem1, sem2) : object 'sem1' not found

How can I resolve this such that the argument semMat will also work with 
variables in the dataframe 'dat' just as the variables in the formula depend on 
dat?


lm.eiv <- function(...) UseMethod("lm.eiv")

lm.eiv.default <- function(x, y, ind, semDep, semMat, ...){
                result <- lm.eiv.fit(x, y, ind, semDep, semMat, ...)
                result$call <- match.call()
                class(result) <- "eiv"
                result
}

lm.eiv.formula <- function(formula, data, na.action, subset, ind, semDep, 
semMat, ...){
                mf <- match.call(expand.dots = FALSE)
    m <- match(c("formula", "data", "na.action", "subset"), names(mf), 0L)
    mf <- mf[c(1L, m)]
    mf$drop.unused.levels <- TRUE
    mf[[1L]] <- as.name("model.frame")
    mf <- eval(mf, parent.frame())
                y <- model.response(mf)
                mt <- attr(mf, "terms")
                x <- model.matrix(mt, mf, contrasts)
                result <- lm.eiv.default(x, y, ind, semDep, semMat, ...)
                result$call <- match.call()
                result$formula <- formula
                result
                }

aa <- lm.eiv.formula(InstructScore_Spring ~ InstructScore_Fall, dat, ind = 2, 
semDep = 0, semMat = dat$InstructScoreSE_Fall)

        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list
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.

Reply via email to