No.16997 データ変換の方法について  【minaminoshima】 2012/06/05(Tue) 18:20

タイトルがこれで良いのか,よく分からないのですが,

HbA1c国際標準化により表記の変更をしてデータ解析することになったのですが,計算式を使えば済む事ではあるのですが,JDS値をランク分けした群ごとにJDS値+○.○の換算式もあります。

このグループ毎の換算式を使って,JDS→NGSP値とするロジックをRでやってみようと思ったのですが,スクリプトが上手くいきません。
if文の組合せを関数にすれば良いのではないかと思いますが,,,。

換算式は
JDS値:4.9%以    → NGSP値=JDS値+0.3
JDS値:5.0〜9.9%  → NGSP値=JDS値+0.4
JDS値:10.0〜14.9% → NGSP値=JDS値+0.5

基本的にRの文法が良く分かっていないというのが,悪いのですが,ご教示頂ければ幸いです。

***HbA1cNGSP <- function{                  if (*** HbA1cNGSP <- function{ if (***hba1cjds < 4.9){
***HbA1cNGSP==∗∗∗ HbA1cNGSP==*** hba1cjds + 0.3 }
else if (***hba1cjds<10.0)∗∗∗$HbA1cNGSP==∗∗∗$hba1cjds+0.4else∗∗∗ hba1cjds < 10.0){ ***$HbA1cNGSP==***$hba1cjds + 0.4 } else *** HbA1cNGSP==***$hba1cjds + 0.5 }
}

***はデータセットの名前のつもりです。
if文の使い方が良く分かりません。如何ネストさせていいのか,,,。

よろしくお願いします。

No.16998 Re: データ変換の方法について  【青木繁伸】 2012/06/05(Tue) 21:58

関数の作り方も,代入もこれではだめですね。R 使えます?
あなたの作ったものの雰囲気を残すとすれば以下のようなもの。
ただし,これは JDS にはベクトルを許さない。
NGSP <- function(JDS) {
if (JDS < 5) {
JDS + 0.3
} else if (JDS < 10) {
JDS + 0.4
} else {
JDS + 0.5
}
}
ベクトルも許すようにするなら以下のように。
NGSP <- function(JDS) {
JDS+ifelse(JDS < 5, 0.3, ifelse(JDS < 10, 0.4, 0.5))
}
JDS が 15 以上の場合もプログラム化しないといけないのでしょうが,取りあえず。

以下のように使う。
> NGSP(4.9)
[1] 5.2
> NGSP(5.0)
[1] 5.4
> NGSP(c(4.8, 4.9, 5.0, 5.1))
[1] 5.1 5.2 5.4 5.5
> dat <- data.frame(abc=c(4.8, 4.9, 5.0, 5.1))
> NGSP(dat$abc)
[1] 5.1 5.2 5.4 5.5
なお,この変換式は境界値のときにギャップができるんですね。あまりよい変換式ではなさそうですが。

No.17000 Re: データ変換の方法について  【minaminoshima】 2012/06/06(Wed) 00:38

ありがとうございます。
Rには使われている方で,スクリプトは苦手で,避けてきていたのですが,避けられない状態になってきましたので,挑戦を始めているところです。

先生の書かれた「Rによる統計解析」を先日ようやく購入できまして,数値のカテゴライズかとか,目からうろこの,驚きの連続で,嬉しくなっている初心者です。

エクセルとRを使い分けていたのですが,Rが認識する変数の形にしないと解析が上手くいかないと思い,先生の本を購入したことで,一歩前進したような気になっています。

御教示頂いた方法以外に,便利な関数は他にあるのでしょうか?

No.17001 Re: データ変換の方法について  【青木繁伸】 2012/06/06(Wed) 13:21

一般的でない特殊な変数変換に対応するような関数はないでしょう。作るしかない。

No.17003 Re: データ変換の方法について  【minaminoshima】 2012/06/06(Wed) 15:37

ありがとうございます。
糖尿病学会の委員会からの文書では,上記の前段に

NGSP値(%)=1.02*JDS(%)+0.25% と
JDS値 (%)=0.980*NGSP値(%)‐0.245 の2回帰式を提示し,相互に正式な換算が可能である。と説明しています。

これを関数にすると
NGSP <- function(JDS) {
1.02*JDS+0.25
}

あるいは

JDS <- function(NGSP) {
0.980*JDS−0.245
}という事でよろしいのでしょうか。

先生の御本では
2.11「新しい変数を作る」で,transform関数を紹介されています。

この方が素人にも綺麗に見えます。
さっそく使わせていただきます。
datasetを対象のデータファイルとすると,数値の丸目を一気にやるのはどんなものかと,

NGSP <- transform(dataset,round(1.02*JDS+0.25,1)) ということでもよいでしょうか。
よろしくお願いします。

No.17004 Re: データ変換の方法について  【青木繁伸】 2012/06/06(Wed) 17:09

変換した数値は,丸めたりしない方がよいと思います。

No.17005 Re: データ変換の方法について  【minaminoshima】 2012/06/06(Wed) 17:48

御教示ありがとうございます。
勉強になりました。

● 「統計学関連なんでもあり」の過去ログ--- 045 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る