R语言Epanechnikov核函数实现报错解决及两种实现对比
Epanechnikov核函数R实现问题解答
问题1:第一版代码报错修复方案
你遇到的报错完全是语法层面的括号不匹配问题,和变量作用域无关:
在kern_epenechnikov_epe函数的循环体内,以下代码多写了1个右括号:
# 错误写法,末尾多了1个) y[i] <-y[i] + epe_vec((xx[i] - x)/h))
括号不匹配会导致R解析代码时误判函数定义提前终止,后续代码被识别为函数外的全局代码,自然找不到函数内部定义的xx变量,也会把后续的函数闭合}识别为非法字符。
修复步骤
- 删除多余的右括号
- 补充求和逻辑:
epe_vec返回的是和输入样本x长度相同的向量,每个元素对应单个样本在当前评估点的核值,需要求和后才能赋值给标量y[i]
修复后的完整函数代码:
kern_epenechnikov_epe<-function(x, h, m = 512){ rg <- range(x) xx <- seq(rg[1] - 3 * h, rg[2] + 3 * h, length.out = m) y <- numeric(m) for (i in seq_along(xx)) # 删去多余右括号,补充sum求和 y[i] <- y[i] + sum(epe_vec((xx[i] - x)/h)) y <- 3*y / (4 * length(x) * h) # 额外补充核密度的归一化因子,可选 list(x = xx, y = y) }
问题2:两版实现的异同对比
相同点
- 基础框架一致:都是先根据输入数据范围生成评估点序列,遍历每个评估点计算核值,最终返回评估点和对应核结果
- 核函数的基础表达式一致:都是基于
1-x²的Epanechnikov核结构
不同点
- 核截断逻辑差异:第一版通过
epe函数实现了Epanechnikov核的定义要求,当核参数绝对值≥1时返回0;第二版没有做截断判断,无论核参数绝对值是否超过1,都会计算1-x²,当|x|≥1时会得到不符合核定义的负值,结果错误。 - 语法正确性差异:第一版存在括号不匹配的语法错误,第二版语法本身是合法的。
- 运算结果长度处理:第一版调用向量化后的
epe_vec会返回向量,必须求和后才能赋值给标量y[i];第二版直接对样本向量做运算,同样需要补充sum()才能得到正确的核累计值,否则会出现长度不匹配的警告或错误。
内容的提问来源于stack exchange,提问作者Magnus Moller
相关产品推荐
相关产品推荐

