Memprediksi setelah menjalankan fungsi mlogit di R

11

Inilah yang ingin saya lakukan, tetapi sepertinya tidak ada predictmetode untuk mlogit. Ada ide?

library(mlogit)
data("Fishing", package = "mlogit")
Fish <- mlogit.data(Fishing, varying = c(2:9), shape = "wide", choice = "mode")

Fish_fit<-Fish[-1,]
Fish_test<-Fish[1,]
m <- mlogit(mode ~price+ catch | income, data = Fish_fit)
predict(m,newdata=Fish_test)
Zach
sumber
4
Apakah Anda membaca sketsa yang menyertainya, Estimasi model logit multinomial di R: Paket mlogit ? Menurut saya Anda hanya perlu menerapkan koefisien yang dipasang pada data baru, bukan?
chl
@ chl itulah yang harus saya lakukan, ya, tapi saya berharap saya tidak perlu menemukan kembali roda.
Zach

Jawaban:

2

Ini trik yang berguna: Tambahkan data yang ingin Anda prediksi ke sampel estimasi asli Anda, tetapi gunakan variabel bobot untuk mengatur bobot pengamatan baru menjadi nol. Perkirakan model (dengan pengamatan baru tertimbang ke nol), dan dapatkan prediksi dari output "probabilitas". Dengan begitu Anda dapat mem-bypass fungsi prediksi, yang merupakan kekacauan.

Robert Bray
sumber
6

Paket mlogit memang memiliki metode predict (), setidaknya dalam versi yang saya gunakan (0.2-3 dengan R 2.15.3).

Kode yang dibuat oleh @Zach memiliki satu kesalahan di dalamnya. Data "format panjang" yang digunakan oleh mlogit () memiliki satu baris untuk setiap alternatif; ini adalah format yang dibuat oleh fungsi mlogit.data (). Oleh karena itu untuk mendapatkan prediksi untuk kasing pertama, Anda perlu mencabut semua baris kasing, dan ada 4:

Fish_fit<-Fish[-(1:4),]
Fish_test<-Fish[1:4,]
m <- mlogit(mode ~price+ catch | income, data = Fish_fit)
predict(m,newdata=Fish_test)

yang memberikan hasil yang bagus.

atiretoo - mengembalikan monica
sumber
4

Setelah cukup banyak upaya dalam mencoba menggunakan fungsi prediksi untuk populasi, saya pikir saya dapat menambahkan beberapa wawasan untuk semua jawaban Anda.

The predictfungsi mlogit bekerja dengan baik, Anda hanya perlu melakukan beberapa penyesuaian dan pastikan bahwa hal-hal berikut diurus:

  1. The newdata(seperti yang diharapkan) harus mencakup persis data yang sama dengan sampel yang digunakan untuk estimasi model. Ini berarti bahwa seseorang harus memeriksa properti "tersembunyi" dari data (seperti factoryang mewarisi level yang tidak ada - dropleveldapat berguna dalam kasus ini-, atau tidak dimasukkan dalam faktor sampel, atau salah colnamedll).

  2. Anda harus membuat pilihan sewenang-wenang dalam data baru Anda (jika tidak ada) sesuatu yang dapat dengan mudah dilakukan menggunakan samplefungsi:

    MrChoice <-sample(c("Car", "Bus", "Walk"),nrow(datase),replace=TRUE, prob = c(0.5, 0.4, 0.1))
    mynewData$mode<-MrChoice
  3. Langkah selanjutnya yang diperlukan adalah mengubah lagi data menjadi data mlogit, menggunakan fungsi yang sama seperti yang digunakan untuk data sampel, misalnya:

    ExpData3<- mlogit.data(mynewData, shape="wide", choice = "mode",sep=".",id = "TripID")
  4. Langkah terakhir adalah prediksi aktual menggunakan predictfungsi.

    resulted<-predict(ml1,newdata=ExpData3)
Manos C
sumber
2

Untuk menjawab pertanyaan saya sendiri, saya telah pindah ke menggunakan paket 'glmnet' agar sesuai dengan log multinomial saya, yang memiliki keuntungan tambahan menggunakan laso atau jaring elastis untuk mengatur variabel independen saya. glmnet tampaknya jauh lebih 'selesai' dikemas daripada mlogit, lengkap dengan fungsi 'prediksi'.

Zach
sumber
1

mlogitmemiliki fungsi prediksi, tetapi saya merasa sangat sulit untuk digunakan. Saya menulis sendiri serangkaian fungsi yang sangat jelek untuk implementasi yang saya miliki. Siapa pun boleh menggunakan atau memperbaikinya, disimpan di profil github saya .

gregmacfarlane
sumber
0

Saya cukup yakin ini mudah dilakukan dengan paket mlogit yang diberikan dengan menggunakan fungsi pas dan kemudian fungsi prediksi R standar. Seperti yang ditunjukkan oleh chl, meskipun saya belum melakukannya sendiri (paling tidak bukan prediksi), dicontohkan dalam sketsa paket di sini di halaman 29.

sim
sumber
1
Sketsa itu tampak sederhana; dalam praktiknya saya tidak tahu bagaimana cara mendaftar ke data baru. Jadi saya menulis kode saya sendiri, ditautkan di bawah.
gregmacfarlane