为什么 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
, g2
和 g3
), 并且对这些向量进行子集化不会删除名称。
所以当你写 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。)
我是 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
, g2
和 g3
), 并且对这些向量进行子集化不会删除名称。
所以当你写 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。)