R 如何使用chisq.test()正确进行卡方检验?

R 如何使用chisq.test()正确进行卡方检验?,r,R,我正在尝试对拟合优度进行皮尔逊卡方检验。以下是拟合泊松分布的示例: data <- rpois(200,50) estimate <- mean(data) freq.os<-table(data) yfit <- dpois(as.integer(names(freq.os)), estimate) chisq.test(x = freq.os, p = yfit) # Error in chisq.test(x = freq.os, p = yfit) : prob

我正在尝试对拟合优度进行皮尔逊卡方检验。以下是拟合泊松分布的示例:

data <- rpois(200,50)
estimate <- mean(data)
freq.os<-table(data)
yfit <- dpois(as.integer(names(freq.os)), estimate)

chisq.test(x = freq.os, p = yfit)
# Error in chisq.test(x = freq.os, p = yfit) : probabilities must sum to 1.

但是我很困惑
chisq.test()
是如何工作的,因为它告诉我
df=429
。我认为
df=n-k-1
,在这种情况下应该是35,其中
k=1
表示lambda和
n=number
项的平方和。我哪里做错了?

上面的评论建议您手动重新缩放
yfit
,然后再将其传递给
chisq.test
。实际上,您可以让
chisq.test()
为您执行以下操作:

chisq.test(x = freq.os, p = yfit, rescale.p = TRUE)

关于您的编辑

chisq.test(freq.os, yfit)
不正确,因为它正在进行独立性测试

chisq.test()
可以执行两个统计测试:

  • 拟合优度检验,使用参数
    x
    p
  • 独立性测试,使用参数
    x
    y
  • 请仔细阅读chisq.test。对于拟合优度测试,必须像最初一样在函数中使用
    p
    参数。我上面的答案是,使用
    rescale.p=TRUE
    将帮助您绕过所看到的错误


    如何进行Pearson卡方检验

    chisq.test(freq.os, yfit)
    
    你说你不知道测试是如何完成的,然后读这部分

    您应该使用
    set.seed()
    ,这样当其他人运行您的代码时,他们会得到与您相同的随机数。以下是一个可复制的示例:

    N <- 200    ## number of samples
    set.seed(0)    ## fix random seed for reproducibility
    x <- rpois(N,50)    ## generate sample
    lambda <- mean(x)    ## estimate mean
    

    你可以看到,结果是一样的。

    确实需要一个,但一般来说,得到向量/数字和的方法是将每个项除以和。例如,
    x=c(0.1,0.2,0.3);y=x/和(x);求和(y)
    这是一个经验频率向量:4141731793075168221881547195042534260726472652245206160813841006732518383239584612912121。好吧,我肯定是做错了什么,我误解了这个函数的用法,认为p=假设分布的预期频率。如果我有一个预期频率和经验频率的向量,我如何使用这个函数?谢谢,你的建议奏效了。但是我仍然对chisq.test的工作原理感到困惑,我添加了可复制的示例。我试着看了一遍源代码,但是因为我对R和编程都是新手,所以一切看起来都非常棒,非常感谢。我记得读到dof应该是n-k-1,其中k是估计参数的个数。既然你估计了lambda值,自由度不应该是29而不是30吗?
    O <- table(x)    ## contingency table / observed frequency
    n <- length(O)    ## number of categories
    # 31
    x0 <- as.integer(names(O))    ## unique sample values
    p <- dpois(x0, lambda); p <- p / sum(p)    ## theoretical probability under Null Hypothesis
    
    E <- p * N    ## expected frequency under Null Hypothesis
    R <- (O - E) / sqrt(E)    ## standardised residuals
    X <- sum(R * R)    ## Chi-square statistic
    # 36.13962
    dof <- n - 1    ## degree of freedom
    # 30
    p.value <- 1 - pchisq(X, df = dof)    ## p-value
    # 0.2035416
    
    z <- curve(dchisq(x, df = dof), from = 0, to = 100)
    abline(v = X, lty = 3)
    polygon(c(X, X, z$x[z$x > X]), c(0, dchisq(X, df = dof), z$y[z$x > X]), col = 2)
    
    chisq.test(O, p = p)
    
    #Chi-squared test for given probabilities
    
    #data:  O
    #X-squared = 36.14, df = 30, p-value = 0.2035