Masalah dalam memasukkan nilai yang hilang dengan kNN di r

Saya ingin menghubungkan nilai yang hilang dengan rata-rata tetangga terdekat, tetapi ketika saya mencoba kNN, muncul pesan kesalahan.

Jadi vektornya adalah Harga Saham, artinya saya punya NA di akhir pekan. Saya ingin mengganti nilai NA (Sabtu, Minggu) dengan fungsi cekung: (Nilai Jumat + Nilai Senin)/2. Saya pikir fungsi kNN dengan k=2 akan sesuai, tetapi saya mendapatkan pesan kesalahan.

> Oriental_Stock$Stock
 [1] 42.80 43.05 43.00 43.00 42.20    NA    NA 42.50 40.00 40.25 40.55 
 41.50    NA    NA 40.85
> kNN(Oriental_Stock, variable = colnames("Stock"), k = 2)
Error in `[.data.table`(data, indexNA2s[, variable[i]], `:=`(imp_vars[i],  
 : i is invalid type (matrix). Perhaps in future a 2 column matrix could 
  return a list of elements of DT (in the spirit of A[B] in FAQ 2.14). 
  Please report to data.table issue tracker if you'd like this, or add 
  your comments to FR #657.

Tolong beri tahu saya apakah mungkin melakukan ini dan mungkin ada opsi yang lebih mudah daripada kNN. Saya bukan Data Scientist, hanya seorang pelajar, jadi saya tidak tahu banyak tentang ini. Terima kasih sebelumnya atas saran apa pun!


person Valeriya    schedule 19.06.2019    source sumber


Jawaban (1)


Knn akan bekerja pada data.frame yang memilih tetangga berdasarkan jarak antar baris Anda. Itu tidak berfungsi pada vektor.

For-loop bisa menjadi solusi yang adil untuk ini:

#this finds the locations of the first NA of each couple of NAs
#the TRUE / FALSE part below picks only the first NA from each couple
idx <- which(is.na(stock))[c(TRUE, FALSE)]

#this iterates over the above indexes and calculates the mean and updates the NAs
for (x in idx) {
  stock[x] <- stock[x+1] <- (stock[x-1] + stock[x+2]) / 2
}

Hasil:

> stock
 [1] 42.800 43.050 43.000 43.000 42.200 42.350 42.350 42.500 40.000
[10] 40.250 40.550 41.500 41.175 41.175 40.850

Saya menggunakan stock sebagai data:

stock <- c(42.80,43.05, 43.00, 43.00, 42.20,    NA,    NA, 42.50, 40.00, 40.25, 40.55, 
           41.50,    NA,    NA, 40.85)
person LyzandeR    schedule 19.06.2019