为什么 return(pval) 给出标准。错误作为结果而不是 p 值?

Why is return(pval) giving std. error as the result instead of the p value?

我是 r 的新手,我是一个为执行 Cochran 的同质性 Q 检验而编写的函数。我试图找到 p 值,但函数 returns 是一个标准。错误而不是 p 值,如下所示。我担心我可能写错了代码。如果可以请帮忙。

dput(g1):

c(Estimate = 0.89502349171762, `Std. Error` = 0.198551047700126, 
`z value` = 4.50777521491291, `Pr(>|z|)` = 6.55109263453831e-06

dput(g2):

c(Estimate = 0.798619626770536, `Std. Error` = 0.0963490218317536, 
`z value` = 8.28881924888765, `Pr(>|z|)` = 1.14378204173144e-16

dput(g3):

c(Estimate = 0.493965082375263, `Std. Error` = 0.27251885149614, 
`z value` = 1.81259050397201, `Pr(>|z|)` = 0.0698950035163995    
Qtest <- function(g1,g2,g3){
   w1 <- 1/(g1["Std. Error"])^2
   w2 <- 1/(g2["Std. Error"])^2
   w3 <- 1/(g3["Std. Error"])^2
   avg <- (w1*g1["Estimate"] + w2*g2["Estimate"]+ w3*g3["Estimate"])/(w1+w2+w3)
   test <- w1*(g1["Estimate"]-avg)^2 + w2*(g2["Estimate"] - avg)^2+ w3*(g3["Estimate"] - avg)^2
   pval <- 1-pchisq(test, df=1)
   return(pval)
 }
 Qtest(g1,g2,g3)
 # Std. Error 
 #  0.225857 

此函数返回的值是长度为 1 的 命名向量 。该向量的命名纯属偶然:您的计算本身就是使用命名向量 (g1 , g2g3), 并且对这些向量进行子集化不会删除名称。

所以当你写 g1["Std. Error"] 时,那个值是 also named:

 〉g1["Std. Error"]
Std. Error
  0.198551

并且在随后的计算过程中该名称不会自动消失。

但是这个名字没有其他含义:你可以忽略它;该函数返回的值 是您计算的值 — 换句话说,它是 p-value 拒绝通过 Cochran 的 Q 检验检验的假设。

您可以通过 unname:

删除函数中令人讨厌的名称
Qtest <- function (g1, g2, g3) {
    w1 <- 1 / g1["Std. Error"] ^ 2
    w2 <- 1 / g2["Std. Error"] ^ 2
    w3 <- 1 / g3["Std. Error"] ^ 2
    avg <- (w1 * g1["Estimate"] + w2 * g2["Estimate"]+ w3 * g3["Estimate"]) / (w1 + w2 + w3)
    test <- w1 * (g1["Estimate"] - avg) ^ 2 + w2 * (g2["Estimate"] - avg) ^ 2 + w3 * (g3["Estimate"] - avg) ^ 2
    unname(1 - pchisq(test, df = 1))
}

我还添加了一些空格以使函数更具可读性;并删除了多余的 return 函数调用——但除此之外,函数没有改变。还有其他方法可以利用 R 的向量化运算来重写函数。例如,我很想按如下方式重写它:

Qtest = function (g) {
    w = 1 / g[, 'Std. Error'] ^ 2
    avg = sum(w * g[, 'Estimate']) / sum(w)
    test = sum(w * (g[, 'Estimate'] - avg) ^ 2)
    1 - pchisq(test, df = 1)
}

此函数需要一个结果矩阵:

Qtest(rbind(g1, g2, g3))

(也就是说,我不相信这个实现是正确的——至少它不是通用的,因为自由度固定为 1。)