将R中的两个相似函数矢量化为一个

时间:2018-05-30 10:43:31

标签: r function vectorization

今天,我遇到了一个问题:两个几乎相同的函数在向量化之前按预期工作,但在它之后,一个工作正常,另一个返回错误。

我正在研究各种估计量对残差和聚合函数的不同变换的鲁棒性。分位数回归和最小正方形是我正在做的特殊情况。

所以我编写了下面的代码,看看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,即使在单个输入上也会阻塞?

1 个答案:

答案 0 :(得分:0)

正如jogo指出的那样,vpen2读取输入向量的元素并尝试获取第一个元素。正确的方法是使用类似

的东西
a <- matrix(..., ncol=2)
apply(a, 1, pen2)

这将返回在矩阵的每一行评估的vpar2的值向量。