我有数据集 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)
现在,我需要测量每个概率点的水平距离值。例如,在 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-统计量几乎相同但不完全相同,尽管结果显着。
有没有更好的方法来使用阶梯函数来获得完全相同的测试统计数据?
这是一个使用
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