`推断`:基于模拟的标准差零分布不以零假设为中心

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

当使用

infer
关于标准差的检验假设时,我意识到基于模拟的零分布永远不会以零假设为中心:

library(tidyverse)
library(infer)

data <- tibble(x = rnorm(100, mean = 2, sd = 1))

data %>%
  specify(response = x) %>%
  hypothesise(null = "point", sigma = 5) %>%
  generate(reps = 1000, type = "bootstrap") %>%
  calculate("sd") %>%
  visualise()

我调查了源代码,没有发现任何转换来生成空分布,我理解有误吗?

由于模拟数据是正常的,我期待接近参数测试的结果(更改为标准差而不是方差):


ggplot(NULL, aes(x = sqrt(rchisq(1000, 99)/(99)*(5)^2))) +
  geom_histogram(bins = 15, color = "white") +
  labs(
    x = "stat",
    y = "count"
  )
r statistics type-inference
1个回答
0
投票

我认为问题出在引导程序上。您使用的引导数据集本身的标准差不是 2(很接近,但不准确)。由于您是从 sd 不为 2 的样本中进行替换绘制,因此平均 sd 将不会是 2。这是一个示例。请注意,数据的标准差为 1.83,即直方图中心位置附近。

library(tidyverse)
library(infer)
set.seed(207)
data <- tibble(x = rnorm(100, mean = 2, sd = 2))
sd(data$x)
#> [1] 1.832712
data %>%
  specify(response = x) %>%
  hypothesise(null = "point", sigma = 5) %>%
  generate(reps = 1000, type = "bootstrap") %>%
  calculate("sd") %>%
  visualize()

下面,我们可以对数据进行变换,使数据本身的标准差恰好为 2,然后您将在直方图中得到预期的答案。


data$x <- data$x * 2/sd(data$x)
sd(data$x)
#> [1] 2
data %>%
  specify(response = x) %>%
  hypothesise(null = "point", sigma = 5) %>%
  generate(reps = 1000, type = "bootstrap") %>%
  calculate("sd") %>%
  visualize()

创建于 2024-01-26,使用 reprex v2.0.2


回复评论

在评论中,OP 询问为什么这适用于均值,但不适用于 SD。

generate()
函数为
bootstrap()
调用
type = "bootstrap"
函数,如示例中所示。在
bootstrap()
中有如下代码:

    if (identical(attr(attr(x, "params"), "names"), 
        "mu")) {
        col <- response_name(x)
        x[[col]] <- x[[col]] - mean(x[[col]], na.rm = TRUE) + 
          attr(x, "params")

当您在假设中指定

mu
时,
"params"
属性将被命名为
mu
,假设值为空。
x
- 被引导的变量 - 然后在引导程序中重新采样之前对其施加零假设均值。因此,本质上,当平均值被引导时,该函数会执行我在答案中手动执行的操作 - 施加原假设值。当你假设
sigma
时,就不会发生这样的事情。它跳过平均值和中位数的检查,然后仅从数据中重新采样。因此,如果您的数据不具有空分布属性(例如 sd=2),那么您将无法获得正确的答案。这似乎是包作者的疏忽。但是,您可以通过在调用
generate()
之前对管道中的数据施加空条件来解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.