r - return(pval) が std を与えるのはなぜですか。 p値の代わりに結果としてエラーが表示されますか?

okwaves2024-01-25  8

私は r を初めて使用しますが、均一性についてコクランの Q テストを実行するために書かれた関数です。 p 値を見つけようとしていますが、関数は std を返します。以下に示すように、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 

データは再現可能な形式で共有してください (印刷結果を表示するのではなく dput(g1) を使用してください)。結果はおそらく、入力ベクトルからの名前を保持するだけです。再試行してくださいターン(名前を付けない(pval))。 R には、計算しているものが p 値なのか標準誤差なのかを知る方法がありません。

– ミスターフリック

2020 年 9 月 3 日 19:44

余談: ここで return を使用する理由はありません。 R では、すべての式が値を持ち、{} シーケンスの値はその中の最後の式の値になります。したがって、関数の値は、呼び出されたときの関数の最後の式の値になります。 — これは、 pval <- 1-pchisq(test, df=1) と return(pval) の代わりに、 1 - pchisq(test, df=1) のみを記述する必要があることを意味します。

– コンラッド・ルドルフ

2020 年 9 月 3 日 20:37



------------------------

この関数によって返される値は、長さ 1 の名前付きベクトルです。このベクトルに名前が付けられたのはまったくの偶然です。計算自体は名前付きベクトル (g1、g2、g3) を使用しており、これらのベクトルをサブセット化しても名前は削除されません。

したがって、 g1["Std.エラー"] の場合、その値には次の名前も付けられます。

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

また、名前は後続の計算中に自動的に消えることはありません。

しかし、その名前が私を意味するものではありませんそれは無視して構いません。その関数によって返される値は、計算した値です。つまり、コクランの Q 検定によって検定された仮説を棄却した p 値です。

関数内の煩わしい名前は、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.)

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。