2016-06-17 10 views
1

この質問はパッケージ固有のものでもありますが、私のデータセットにpredict関数を使用したときに何が間違っているのかを評価しました。L1はモデルから予測できませんでした

require(penalized) 
# neg contains negative data 
# pos contains positive data 

今、手順は以下の(用語でバランスが正と負の例をOS)トレーニングおよび検証データセットを同等の構築を目指して:

私が使用している手順は、次のようです。

# 50% negative training set 
negSamp <- neg %>% sample_frac(0.5) %>% as.data.frame() 
# Negative validation set 
negCompl <- neg[setdiff(row.names(neg),row.names(negSamp)),] 
# 50% positive training set 
posSamp <- pos %>% sample_frac(0.5) %>% as.data.frame() 
# Positive validation set 
posCompl <- pos[setdiff(row.names(pos),row.names(posSamp)),] 
# Combine sets 
validat <- rbind(negSamp,posSamp) 
training <- rbind(negCompl,posCompl) 

ここで、2つの比較可能なセットがあります。

[1] FALSE TRUE 
> dim(training) 
[1] 1061 381 
> dim(validat) 
[1] 1060 381 
> identical(names(training),names(validat)) 
[1] TRUE 

モデルをトレーニングセットに問題なくフィットさせました(ここでは、Lambda1値の範囲を試してみました)。しかし、検証データセットにモデルを当てはめると、ちょっと奇妙なエラー記述で失敗します。

> fit <- penalized(VoiceTremor,training[-1],data=training,lambda1=40,standardize=TRUE) 
# nonzero coefficients: 13 
> fit2 <- predict(fit, penalized=validat[-1], data=validat) 
Error in .local(object, ...) : 
    row counts of "penalized", "unpenalized" and/or "data" do not match 

ただ、これはいくつかのNAのデータセット内によるものではないことを確認する:

> identical(validat,na.omit(validat)) 
[1] TRUE 

奇妙なことに、私は適切なデータセットに匹敵するいくつかの新しいデータを生成してもよいです

data.frame(VoiceTremor="NVT",matrix(rnorm(380000),nrow=1000,ncol=380)) -> neg 
data.frame(VoiceTremor="VT",matrix(rnorm(380000),nrow=1000,ncol=380)) -> pos 
> dim(pos) 
[1] 1000 381 
> dim(neg) 
[1] 1000 381 

上記の手順を実行すると、2番目のフィットが機能します。 どうしてですか?第2の(トレーニングではない)データセットで何が間違っているのでしょうか?

答えて

0

Ok、

この問題の解決方法が見つかりました。問題は私の補完的なデータセットの発見にありました。

neg[setdiff(row.names(neg),row.names(negSamp)),] 

は正しいことをしませんが、

neg %>% 
rownames_to_column() %>% 
filter(! rowname %in% row.names(negSamp)) %>% 
column_to_rownames() %>% data.frame() 

はありません。この変更により、as.data.frameの代わりにdata.frameを使用すると、すべて動作します。

関連する問題