【问题标题】:Manually calculate two-sample kolmogorov-smirnov using ECDF使用 ECDF 手动计算两样本 kolmogorov-smirnov
【发布时间】:2019-04-12 15:07:35
【问题描述】:

我正在尝试手动计算两个随机样本的 KS 统计量。据我了解,KS 统计量 D 是两个 CDF 之间的最大垂直偏差。但是,手动计算两个 CDF 之间的差异并从基础 R 运行 ks.test 会产生不同的结果。我想知道错误在哪里。

set.seed(123)
a <- rnorm(10000)
b <- rnorm(10000)

### Manual calculation 
# function for calculating manually the ecdf
decdf <- function(x, baseline, treatment)  ecdf(baseline)(x) - ecdf(treatment)(x)
#Difference between the two CDFs 
d <- curve(decdf(x,a,b), from=min(a,b), to=max(a,b))
# getting D 
ks <- max(abs(d$y))

#### R-Base calculation 

ks.test(a,b)

R-Base D = 0.0109,而手动计算为 0.0088。任何解释差异的帮助表示赞赏。

我附上 R-Base 源代码(有点清理)


n <- length(a)                                                                          
n.x <- as.double(n)
n.y <- length(b)
n <- n.x * n.y/(n.x + n.y)
w <- c(a, b)
z <- cumsum(ifelse(order(w) <= n.x, 1/n.x, -1/n.y))
STATISTIC <- max(abs(z))


【问题讨论】:

    标签: r cdf


    【解决方案1】:

    默认情况下,curvefromto 之间的 100 个点的细分上评估函数。通过限制在这 100 个点,您可能会错过获得最大差异的值。

    相反,评估 ecdf 跳跃的所有点的差异,您肯定会捕捉到达到最大差异的值。

    set.seed(123)
    a <- rnorm(10000)
    b <- rnorm(10000)
    Fa <- ecdf(a)
    Fb <- ecdf(b)
    
    x <- c(a,b) # the points where Fa or Fb jump
    
    max(abs(Fa(x) - Fb(x)))
    # [1] 0.0109
    

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 2016-11-06
      • 2012-06-08
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2021-06-18
      • 2016-12-20
      • 2015-03-25
      相关资源
      最近更新 更多