You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Johnson分布进行均值比较时的代码异常问题咨询

使用Johnson分布进行均值比较时的代码异常问题咨询

你好!我帮你排查下代码里的问题,导致不管调整偏度值,经验alpha都固定为1.000的原因主要有两个核心错误:

1. 循环遍历逻辑错误

你代码里的循环写法完全不对:

p <- vector(length=k)
for (i in p){
  muestra <- poblacion[rJohnson(1000, parms)]
  p[i] <- t.test(muestra, mu = mu.pob)$p.value
}

这里p初始是长度500的空向量,for (i in p)会遍历p的初始元素(默认是0或者NA),而不是遍历1到500的索引。这直接导致p[i]的赋值完全失效,p始终保持全0的初始状态。当计算经验alpha时,所有0都小于0.05,所以length(p[p<a_teo])就是500,除以500自然得到1.000,和偏度参数完全无关。

正确的循环写法应该是按索引遍历:

p <- numeric(k) # 明确指定数值型向量,避免默认类型问题
for (i in 1:k){
  # 后续抽样和计算代码
}

2. 抽样逻辑错误

你用rJohnson(1000, parms)的结果作为poblacion的索引,这是完全错误的:rJohnson生成的是符合Johnson分布的连续型数值,根本不是poblacion向量的合法索引(索引必须是1到1000的整数)。这种错误抽样会导致muestra的取值完全不符合预期,进一步干扰t检验的结果。

正确的抽样应该是从已生成的总体中随机抽取样本(推荐有放回抽样,模拟重复抽样场景):

muestra <- sample(poblacion, 1000, replace = TRUE)

修正后的完整代码

library(moments)
library(SuppDists)

k <- 500

# 这里可以修改偏度值,比如0.3或1
skew_val <- 0.3
parms <- JohnsonFit(c(0, 1, skew_val, 6))
sJohnson(parms)
poblacion <- rJohnson(1000, parms)

mu.pob <- mean(poblacion)
sd.pob <- sd(poblacion)

p <- numeric(k)
for (i in 1:k){
  muestra <- sample(poblacion, 1000, replace = TRUE)
  p[i] <- t.test(muestra, mu = mu.pob)$p.value
}

a_teo = 0.05
a_emp = length(p[p<a_teo])/k
sprintf("alpha_teo = %.3f <-> alpha_emp = %.3f", a_teo, a_emp)

修正之后,当你调整skew_val为1时,经验alpha值就会正常变化,不会再固定为1.000了。

备注:内容来源于stack exchange,提问作者BehSci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 11:23:17