减去由用户定义的函数创建的矩阵中的列

时间:2014-04-16 12:20:54

标签: r function confidence-interval

我在减去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

我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:0)

查看uplow。对于标准正态分布,这些值太大了。

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