我在减去R中用户定义函数生成的两列时遇到了一些麻烦。
我的数据:
dat <- data.frame(matrix(rnorm(1000), nrow=50))
我的功能:
CI <- function(Int, dat){
alpha = (1-Int) / 2
z <- qnorm(1-alpha)
N <- sum(is.na(dat)==FALSE)
av <- colMeans(dat, na.rm=TRUE)
me <- z*(N/sqrt(N))
lower <- av - me
upper <- av + me
return(cbind(lower, upper))
}
该函数试图手动确定一列值的置信区间的上部和下部(较大方案的一部分)。 我当时想要做的是从较低的CI中减去上部以获得范围。这是我的尝试:
CI(Int=0.99, dat=dat)
CIdat <- CI(Int=0.99, dat=dat)
up <-as.numeric(CIdat[,2])
low <-as.numeric(CIdat[,1])
up+low
up-low
up + low有效,但up - low给出了统一的结果:
> up+low
[1] -0.24418497 0.26253152 -0.35225948 0.27564574 -0.10129327 -0.14313671 0.11122208 0.30469330 -0.09498985
[10] -0.05658091 -0.19336386 -0.31854479 -0.05433397 -0.03539858 0.07648641 -0.46213684 0.66736452 0.42824967
[19] 0.29344554 -0.06257925
> up-low
[1] 162.9097 162.9097 162.9097 162.9097 162.9097 162.9097 162.9097 162.9097 162.9097 162.9097 162.9097 162.9097
[13] 162.9097 162.9097 162.9097 162.9097 162.9097 162.9097 162.9097 162.9097
我错过了一些明显的东西吗?
答案 0 :(得分:0)
查看up
和low
。对于标准正态分布,这些值太大了。
mean(up) mean(low)
[1] 81.47071 [1] -81.43904
您CI()
函数中某处可能存在思考错误。如果我理解正确,您有一个多维标准正态分布dat
,并希望得到dat
的每个维(列)的置信区间的范围。
我建议按以下方式进行:
CI_span <- function(Int, dat) {
alpha <- (1 - Int) / 2
p_range <- c(alpha, 1 - alpha)
apply(dat, 2, function(iColDat) as.numeric(diff(quantile(iColDat, probs = p_range))))
}
这将返回每列CI的跨度。 R具有内置函数,用于计算称为quantile
的经验分位数。
H个, d