1

今のところ、相関行列にある各ファイルの最適な相関を探す関数があります。私はlist.filesに取り組んでいます。関数は次のとおりです。

get.max.cor <- function(station, mat){
        mat[row(mat) == col(mat)] <- -Inf        
        which( mat[station, ] == max(mat[station, ],na.rm=TRUE) )
     }

このような相関行列がある場合 (NA 値なし):

cor1 <- read.table(text="
ST208     ST209     ST210     ST211     ST212
ST208 1.0000000 0.8646358 0.8104837 0.8899451 0.7486417
ST209 0.8646358 1.0000000 0.9335584 0.8392696 0.8676857
ST210 0.8104837 0.9335584 1.0000000 0.8304132 0.9141465
ST211 0.8899451 0.8392696 0.8304132 1.0000000 0.8064669
ST212 0.7486417 0.8676857 0.9141465 0.8064669 1.0000000
", header=TRUE)

それは完全に機能します。次のようないくつかの NA (ただし、NA だけではない) を持つ相関行列がある場合:

cor2 <- read.table(text="
ST208     ST209     ST210     ST211     ST212
ST208 1.0000000 NA 0.9666491 0.9573701 0.9233598
ST209 NA 1.0000000 0.9744054 0.9577192 0.9346706
ST210 0.9666491 0.9744054 1.0000000 0.9460145 0.9582683
ST211 0.9573701 0.9577192 0.9460145 1.0000000 NA
ST212 0.9233598 0.9346706 0.9582683 NA 1.0000000
", header=TRUE)

na.rm=TRUE のおかげでまだ機能しますが、データのないファイルが 1 つある場合、次のように列に NA のみが表示されます。

cor3 <- read.table(text="
ST208     ST209     ST210     ST211     ST212
ST208 1.0000000 NA 0.8104837 0.8899451 0.7486417
ST209 NA NA NA NA NA
ST210 0.8104837 NA 1.0000000 0.8304132 0.9141465
ST211 0.8899451 NA 0.8304132 1.0000000 0.8064669
ST212 0.7486417 NA 0.9141465 0.8064669 1.0000000
", header=TRUE)

もちろん、NA以外の値がないため、このファイルには最大相関がないため、機能しません。そのため、このエラーが発生しました: 0 (non-na) ケース。NA 列を削除しようとしましたが、list.files で作業しているため、リスト内とマトリックス内のファイルの数は同じではありません。Web で検索しましたが、NA 列の削除に関するトピックしか見つかりませんでした。私の場合、これらの NA 列を削除せずに無視したいと思います。

R に言いたいのですが、相関行列で各ファイルの最高の相関を探しているときに、相関係数のないファイル (NAs 列のみ) を見つけた場合は、何もしないでください。これを実行して、次のファイル (次の列または行) に移動します。この問題を回避するために、else {NA} または else {NULL} も入れようとしましたが、それでも機能しません。

誰かがこの問題を解決する方法を知っていますか? どうもありがとうございました。

よろしくジェフリー


ご回答ありがとうございます。

Joran のコードを使用して NA 列で動作するようになったと思います。そして、あなたも本物のジョランです。get.max.cor の出力を処理するために使用される次の関数でエラーが発生しました。

    na.fill <- function(x, y){        
            i <- is.na(x[1:8700,1])
            xx <- y[1:8700,1]        
            new <- data.frame(xx=xx)
            x[1:8700,1][i] <- predict(lm(x[1:8700,1]~xx, na.action=na.exclude), new)[i]
            x        
        }

process.all <- function(df.list, mat){

        f <- function(station)
             na.fill(df.list[[ station ]], df.list[[ max.cor[station] ]])

        g <- function(station){
        x <- df.list[[station]]
        if(any(is.na(x[1:8700,1]))){
            mat[row(mat) == col(mat)] <- -Inf
            nas <- which(is.na(x[1:8700,1]))
            ord <- order(mat[station, ], decreasing = TRUE)[-c(1, ncol(mat))]
            for(y in ord){
                if(all(!is.na(df.list[[y]][1:8700,1][nas]))){
                    xx <- df.list[[y]][1:8700,1]
                    new <- data.frame(xx=xx)
                    x[1:8700,1][nas] <- predict(lm(x[1:8700,1]~xx, na.action=na.exclude), new)[nas]
                    break
                }
            }
        }
        x
    }             

        n <- length(df.list)
        nms <- names(df.list)
        max.cor <- sapply(seq.int(n), get.max.cor, corhiver2008capt1)
        df.list <- lapply(seq.int(n), f)
        df.list <- lapply(seq.int(n), g)
        names(df.list) <- nms
        df.list
    }

    refill <- process.all(lst, corhiver2008capt1)
    refill <- as.data.frame(refill)
    capt1_hiver <- refill[1:8700,]

この関数は、最適な相関ファイルに従ってファイルを埋めるために使用されます (以前にそれを選択するために行ったこと)。私のエラーは次のとおりです。

Error in model.frame.default(formula = x[1:8700, 1] ~ xx, na.action = na.exclude,  : 
  invalid type (NULL) for variable 'xx'

これはおそらく、相関行列の「NULL 列」が原因です。xx ファイルにはデータ (関連付けのないファイル) がありません。データの次元を変更せずに計算を続行し、NULL ファイルを無視する (または何もしない) (NA ファイルを保持する)にはどうすればよいですか? 今のところ、(NA だけでなく) データを含むファイルのみを選択した場合にのみ機能します。

4

2 に答える 2

3

そのため、サンプル コードでここで何が得られているのか完全にはわかりませんが、ここで説明します。

cor3すべての欠損値を含むの行で関数を実行すると、次のようになります。

> get.max.cor("ST209",cor3)
[1] 2

これはエラーでも警告でもありませんが、おそらくあなたが望んでいたものではありません。-Inf各ステーションはおそらくそれ自体と完全に相関しており、それを最大にしたくないため、書かれているように、関数は対角要素を に置き換えます。

これは、次の行が値のみの行で動作していないことを意味します。 NAあそこ-Infにあるよ。したがってna.rm = TRUE、値以外はすべて投げます-Inf。それが残っているすべてなので、それが最大値です。

明らかに、それはあなたが望んでいたものではありません。ただし、この関数を使用して行を反復処理する方法も実際には指定していないため、推測する必要があります。関数を変更して、最大値が有限かどうかを確認する場合:

get.max.cor <- function(station, mat){
     mat[row(mat) == col(mat)] <- -Inf
     m <- max(mat[station, ],na.rm=TRUE)
     if (is.finite(m)) {return(which( mat[station, ] == m ))}
     else {return(NA)}
}

NAその行がすべての値だったときに返すことができNAます。しかし、おそらくNA、出力を処理するために使用しているコードでそれを処理する必要もありますget.max.cor(提供していないため、実際には役に立ちません)。

于 2012-05-31T11:38:06.413 に答える
0

ダナスが指摘したように、あなたはおそらくあなたが望むものを手に入れます。ただし、役立つことがわかった場合は、テストを実装する1つの方法があります。

if ( sum(!is.na(cor3[j,])) == 0 ) #all values in j-th row are NA {
   output(j)= NULL
}
于 2012-05-31T11:22:15.947 に答える