R语言核密度及累积分布函数积分计算报错求助
R语言核密度积分错误排查与kerdiest包使用说明
一、积分报错原因及修复
你遇到的Error in integrate(fhat, lower = 0, upper = t) : length(upper) == 1 is not TRUE,本质是R基础包的integrate()函数要求积分上限必须是单个数值,但你传入的upper = t是长度大于1的向量(比如一组待计算的分位点)。
修复方案
如果需要对多个上限值计算积分,用sapply()或lapply()批量处理每个上限:
# 示例:定义高斯核密度函数 fhat <- function(z, data, bw) { n <- length(data) (1/(n*bw)) * sum(dnorm((z - data)/bw)) } # 待计算的多个积分上限 t_values <- c(0.3, 0.8, 1.2) # 批量计算积分结果 cdf_results <- sapply(t_values, function(t) { integrate(fhat, lower = 0, upper = t, data = your_raw_data, bw = your_bandwidth)$value })
如果t本应为单个值,检查变量t是否被误赋值为向量(比如之前的代码中把t定义成了序列)。
二、kerdiest包kde函数自定义带宽
kerdiest包的kde()函数完全支持自定义带宽,直接通过bandwidth参数传入你的目标数值即可:
library(kerdiest) # 模拟数据 raw_data <- rgamma(150, shape = 2) # 自定义带宽h=0.4 kde_output <- kde(raw_data, bandwidth = 0.4) # 提取密度估计的x轴点和对应密度值 x_grid <- kde_output$x density_est <- kde_output$y
若需要基于该密度计算积分,可先通过approxfun()生成插值函数,再用integrate()计算:
# 生成可用于积分的密度函数 kde_fun <- approxfun(x_grid, density_est) # 计算0到1.5的积分 integral_result <- integrate(kde_fun, lower = 0, upper = 1.5)$value
内容的提问来源于stack exchange,提问作者SS_ST
相关产品推荐
相关产品推荐

