16

私は大規模なデータ セットを持っており、データの列の 1 つである都市ごとに異なるロジスティック回帰を適合させたいと考えています。次の 70/30 分割は、City グループを考慮せずに機能します。

indexes <- sample(1:nrow(data), size = 0.7*nrow(data))

train <- data[indexes,]
test <- data[-indexes,]

ただし、これは各都市の 70/30 分割を保証するものではありません。

市 A と市 B があり、市 A には 100 行、市 B には 900 行、合計 1000 行があるとします。上記のコードを使用してデータを分割すると、電車の場合は 700 行、テスト データの場合は 300 行になりますが、電車のデータで都市 A の行が 70 行、都市 B の行が 630 行になるとは限りません。それ、どうやったら出来るの?

トレーニング データを都市ごとに 70/30 に分割したら、都市ごとにロジスティック回帰を実行します (トレーニング データを取得したら、これを行う方法を知っています)。

4

5 に答える 5

1

典型的な方法はsplit

lapply( split(dfrm, dfrm$City), function(dd){
            indexes= sample(1:nrow(dd), size = 0.7*nrow(dd))
            train= dd[indexes, ]    # Notice that you may want all columns
            test= dd[-indexes, ]
            # analysis goes here
            }

上記で試みたように段階的に行うとしたら、次のようになります。

cities <- split(data,data$city)

idxs <- lapply(cities, function (d) {
    indexes <- sample(1:nrow(d), size=0.7*nrow(d))
})

train <- data[ idxs[[1]], ]  # for the first city
test <-  data[ -idxs[[1]], ]

たまたまやり方が不器用だと思いますが、小さなステップに分解すると、中間値を調べることができるかもしれません。

于 2013-12-25T21:42:12.743 に答える
0

City が列の場合、コードはそのまま問題なく機能します。トレーニング データを train[,2] として実行するだけです。ラムダ関数を使用して、それぞれに対してこれを簡単に行うことができます

logReg<-function(ind) {
    reg<-glm(train[,ind]~WHATEVER)
    ....
    return(val) }

次に、都市インデックスのベクトルに対して sapply を実行します。

于 2013-12-26T04:38:23.053 に答える