如何测量两个数据点不均匀的cdf之间的水平距离

问题描述 投票:0回答:1

我有数据集 261 个数据点,另一个有 373 个数据点。这是数据

dataset_1 = data.frame(dataset_name = rep("dataset_1", 261), value = seq(40, 10000, length.out = 261))
dataset_2 = data.frame(dataset_name = rep("dataset_2", 373), value = seq(50, 5000, length.out = 373))

dataset <- rbind(dataset_1,dataset_2)

ks 测试

ks.test(dataset$value[dataset$dataset_name=="dataset_1"],
        dataset$value[dataset$dataset_name=="dataset_2"],
        alternative = c("less")) -> test_result

绘制 ecdfs

library(ggplot2)
dataset %>% 
  ggplot(aes(x= value, group = dataset_name, color = dataset_name)) +
  stat_ecdf(size =2)

ecdfs of these two datasets

现在,我需要测量每个概率点的水平距离值。例如,在 0.25 处,数据集 1 有 2500 个点,数据集 2 有 1250 个点,因此距离为 1250。因为数据集 1 有 261 个点,数据集 2 有 373 个点。我怎样才能生成一个可以显示距离的数据框。

我已经使用线性近似修改了 dataset_1 以创建 373 个数据点,然后检查了结果。

interpolated_dataset_1  <- approx(dataset_1$value, n = 373)

# creating the dataframe
interpolated_dataset_1_dataframe <- data.frame(dataset_name = "modified_dataset_1",
                                       value = interpolated_dataset_1$y)

# combining the data
modified_dataset <- rbind(dataset,interpolated_dataset_1_dataframe)

# the ks test
ks.test(modified_dataset$value[modified_dataset$dataset_name=="modified_dataset_1"],
        modified_dataset$value[modified_dataset$dataset_name=="dataset_2"],
        alternative = c("less")) -> modified_test_result
# the ecdfs
library(ggplot2)
modified_dataset %>% 
  ggplot(aes(x= value, group = dataset_name, color = dataset_name)) +
  stat_ecdf(size =2)

d-统计量几乎相同但不完全相同,尽管结果显着。

有没有更好的方法来使用阶梯函数来获得完全相同的测试统计数据?

r area ecdf
1个回答
0
投票

这是一个使用

ecdf
+
uniroot

的解决方案
dstat <- function(p, df1 = dataset_1, df2 = dataset_2) {
    abs(
        diff(
            sapply(
                list(df1, df2),
                \(v) {
                    with(
                        v,
                        uniroot(
                            \(x) ecdf(value)(x) - p,
                            range(value)
                        )$root
                    )
                }
            )
        )
    )
}

我们可以得到

> dstat(0.25)
[1] 1242.5

> dstat(0.5)
[1] 2495

> dstat(0.75)
[1] 3747.5
© www.soinside.com 2019 - 2024. All rights reserved.