今天,我遇到了一个问题:两个几乎相同的函数在向量化之前按预期工作,但在它之后,一个工作正常,另一个返回错误。
我正在研究各种估计量对残差和聚合函数的不同变换的鲁棒性。分位数回归和最小正方形是我正在做的特殊情况。
所以我编写了下面的代码,看看Square的Least Trimean是如何工作的,并发现如果模型参数作为不同的参数提供它会正常工作,但如果它们出现在向量中则会失败。例如,我需要第一个绘图功能(使用outer(...)
来获取persp
的值矩阵或仅从{{1}向f(x, y)
提供persp3d
是很方便的但是,第二个用于估计(R优化器期望输入向量作为第一个参数,最小化将在其上完成)。
MWE:
library(rgl)
为什么set.seed(105)
N <- 204
x <- rlnorm(N)
y <- 1 + x + rnorm(N)*sqrt(.1+.2*x+.3*x^2)
# A simple linear model with heteroskedastic errors
resfun <- function(x) return(x^2)
# Going to minimise a function of squared residuals...
distfun <- function(x) return(mean(quantile(x, c(0.25, 0.5, 0.5, 0.75))))
# ...which in this case is the trimean
penalty <- function(theta0, theta1) {
r <- y - theta0 - theta1*x
return(distfun(resfun(r)))
}
pen2 <- function(theta) {
r <- y - theta[1] - theta[2]*x
return(distfun(resfun(r)))
}
penalty(1, 1) # 0.5352602
pen2(c(1, 1)) # 0.5352602
vpenalty <- Vectorize(penalty)
vpen2 <- Vectorize(pen2)
vpenalty(1, 1) # 0.5352602
vpen2(c(1, 1))
Error in quantile.default(x, c(0.25, 0.5, 0.5, 0.75)) :
missing values and NaN's not allowed if 'na.rm' is FALSE
被矢量化vpen2
,即使在单个输入上也会阻塞?
答案 0 :(得分:0)
正如jogo指出的那样,vpen2
读取输入向量的元素并尝试获取第一个元素。正确的方法是使用类似
a <- matrix(..., ncol=2)
apply(a, 1, pen2)
这将返回在矩阵的每一行评估的vpar2
的值向量。