今のところ、相関行列にある各ファイルの最適な相関を探す関数があります。私は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 だけでなく) データを含むファイルのみを選択した場合にのみ機能します。