R语言中对密度向量调用sapply计算均值为何未得到预期结果?
问题原因
你调用c(weib, unif)时,R会将两个长度为100的向量直接拼接为一个长度为200的一维数值向量,此时传入sapply后,遍历的对象是200个单独的数值,自然每次mean()都只会对单个数值做计算,返回200个相同的结果。
解决方法
将多个分布的密度向量存入列表而非直接拼接,使用list()替代c()即可,sapply会自动遍历列表的每个元素(每个元素是完整的密度向量)做计算。
修正后的可运行代码如下:
weib <- dweibull(seq(from=0, to=25, length=100), shape=1, scale=5) unif <- dunif(seq(from=1, to=10, length=100), min=1, max=10) mean(weib) # 单独计算可正常得到weib密度向量的均值 # 用list存储多个密度向量,可自定义命名方便区分结果 dists <- list(weibull = weib, uniform = unif) means <- sapply(dists, mean) # 此时means就是包含两个均值的向量,对应两个分布的密度向量均值
拓展说明
如果你需要计算的是韦布尔、均匀分布本身的理论统计矩,而非密度值向量的均值,有两种更准确的方式:
- 直接用对应分布的理论矩公式计算,比如尺度参数为5、形状为1的韦布尔分布理论均值就是5,1到10的均匀分布理论均值为5.5
- 用
rweibull()/runif()生成对应分布的随机样本后再计算样本矩
内容的提问来源于stack exchange,提问作者Autodidactyle
相关产品推荐
相关产品推荐

