我正在尝试在R中编写一个简单的迭代重加权最小二乘算法。我想传递一个函数作为计算权重的参数,但遗憾的是R抱怨无法找到该函数。我有什么想法我做错了吗?提前谢谢!
这是我的代码:
irls <- function(imodel, wfunc, tol) {
repeat {
b0 <- imodel$coef
imodel <- lm(formula(imodel), weights=wfunc(imodel), data=imodel$model)
b1 <- imodel$coef
if(abs((b1-b0)/b0)<=tol) break
}
imodel
}
和一个证明问题的愚蠢的例子
x <- 1:100
y <- x + rnorm(100)
mlm <- lm(y~x-1)
irls(mlm, function(x){rep(1,length(x$fit))},0.001) # error: wfunc not found
答案 0 :(得分:8)
问题出现了lm如何查找数据。如果您将功能更改为此功能似乎可以正常工作
irls <- function(imodel, wfunc, tol) {
repeat {
b0 <- imodel$coef
dat <- imodel$model
dat$wts <- wfunc(imodel)
imodel <- lm(formula(imodel), weights=wts, data=dat)
b1 <- imodel$coef
if(abs((b1-b0)/b0)<=tol) break
}
imodel
}
答案 1 :(得分:5)
formula
包含初始lm
调用的环境(在这种情况下为.GlobalEnv
),
其中wfunc
不可用。
作为解决方法,您可以将其替换为当前环境。
irls <- function(imodel, wfunc, tol) {
f <- formula(imodel)
environment(f) <- environment()
repeat {
b0 <- imodel$coef
imodel <- lm(f, weights=wfunc(imodel), data=imodel$model)
b1 <- imodel$coef
if(abs((b1-b0)/b0)<=tol) break
}
imodel
}
irls(mlm, function(x){rep(1,length(x$fit))},0.001)
答案 2 :(得分:-1)
出现此问题的原因是model.frame.default
在lm
内调用,它会评估公式环境中的所有内容:
model.frame.default
#function (formula, data = NULL, subset = NULL, na.action = na.fail,
# drop.unused.levels = FALSE, xlev = NULL, ...)
#{
#...
# env <- environment(formula)
#...
# extras <- eval(extras, data, env) <-- this is where you run into a problem
#...
与其他人建议的一样,评估lm
以外的功能。