很容易构建高斯核函数,以便它可以处理矢量输入:
K_gaussian <- function(x){return(1/sqrt(2*pi)*(exp(-0.5*x*x)))}
K_gaussian(seq(-1,1,0.5))
# [1] 0.2419707 0.3520653 0.3989423 0.3520653 0.2419707
但是当我尝试编写代码时,我遇到了麻烦,例如,Epanechnikov内核:
K_ep <- function(x){if(abs(x)>1){return(0)} else{return(3/4*(1-x*x))}}
因为if语句搞砸了。例如,以下未提供向量输出:
K_ep(seq(-2,2,0.25))
# [1] 0
Warning message:
In if (abs(x) > 1) { :
the condition has length > 1 and only the first element will be used
如何解决此问题?
答案 0 :(得分:2)
您可以使用两种方法来矢量化您的功能。
由于您只有一个参数,因此最简单的选择是使用sapply
K_ep(seq(-2,2,0.25))
sapply(seq(-2, 2, 0.25), K_ep)
## [1] 0.00000 0.00000 0.00000 0.00000 0.00000 0.32812 0.56250
## [8] 0.70312 0.75000 0.70312 0.56250 0.32812 0.00000 0.00000
## [15] 0.00000 0.00000 0.00000
但是,有时您想要对许多参数进行矢量化,sapply
不再适用。您需要mapply
或Vectorize
(包装)
K_epvect <- Vectorize(K_ep, vectorize.args = "x")
K_epvect(seq(-2,2,0.25))
## [1] 0.00000 0.00000 0.00000 0.00000 0.00000 0.32812 0.56250
## [8] 0.70312 0.75000 0.70312 0.56250 0.32812 0.00000 0.00000
## [15] 0.00000 0.00000 0.00000
答案 1 :(得分:1)
使用ifelse
:
K_ep2 <- function(x){ifelse(abs(x)>1, 0, 3/4*(1-x*x))}
K_ep2(seq(-2,2,0.25))
[1] 0.000000 0.000000 0.000000 0.000000 0.000000 0.328125 0.562500 0.703125 0.750000 0.703125 0.562500 0.328125 0.000000 0.000000 0.000000
[16] 0.000000 0.000000
答案 2 :(得分:1)
在条件为true / false时要返回0的特定情况下,您还可以使用以下内容简化函数:
K_ep <- function(x){return((abs(x)>1)*3/4*(1-x*x))}}
(这个功能不必简化,但在某些情况下可以提供帮助)