2011-05-30 81 views
5

我遇到R代碼問題,而是缺少值。實際上並不知道如何使用簡單的熱甲板方法來推算這些值。例如,有這些數據。缺失值 - 熱點鄰居方法

1 1000.24457235   NA  NA   NA   NA  11 
2 10000132 111 2502357 0.19408587 0.19373610 0.6567305 0.01454520 0.13498823  69 
3 10000388 111 4472360 0.14774927 0.14918678 0.6853377 0.05233508 0.11314044 106 
4 10000792 111 666909 0.10520063   NA  NA   NA   NA  14 
5 10002737 111 1139613 0.19944986 0.20114918 0.3564355 0.20135391 0.24106136  23 
6 10002741 111 981574 0.11573570   NA  NA   NA   NA  13 
7 10002929 111 1417192 0.08770932 0.08387991 0.6106012 0.11078473 0.19473415  24 
8 10003396 111 444966 0.19026263 0.18784110 0.5215772 0.16844381 0.12213789  24 
9 10003517 111 1230589 0.16393216 0.16358568 0.4614005 0.26670712 0.10830670  19 
10 10003546 111 760847 0.12384748   NA  NA   NA   NA  10 

使用第5列,需要找到最近的值,然後在那些地方填寫那個類似的被訪者,其中有NA值。

謝謝。

+0

請使用'dput'來提供您的數據。要格式化代碼,請使用代碼格式化圖標'{}'(或與四個空格對齊),另請參閱http://stackoverflow.com/editing-help。 – Marek 2011-05-30 10:50:29

+0

實際上,沒有得到它,但,改變了解了一些東西:) – Cris 2011-05-30 11:25:24

+0

我添加數據格式。但是當你想發佈樣本數據時,你可以使用'dput'命令,比如'dput(my_data)'(或者'head(dput(my_data))'),它創建R對象的字符串表示形式,包含所有細節。 – Marek 2011-05-30 11:39:57

回答

6

我從來沒有使用熱(或冷)的甲板採樣。然而,一些Google搜索引導我轉到rrp軟件包中的rrp.impute函數。

下面是使用一些合成數據的簡單例子:

install.packages("rrp") 
require(rrp) 
set.seed(1) 
key <- 1:100 
## create random values 
value1 <- 10 + 2 * key + rnorm(100, 0, 10) 
## make 5 values into NAs 
missing <- sample(key, 5) 
value1[missing] <- NA 
## build a dataframe 
df <- data.frame(key, value1) 
## do a nearest neighbor hot deck interpolation 
imputed <- rrp.impute(df)$new.data 

## let's visualize this magic 
plot(df) 
points(missing, imputed$value1[missing], col="red") 

這將使用K = 1,這是我想你想的默認值。在最後的漂亮的圖片看起來是這樣的:

enter image description here

在紅圈的估算值,你可以看到它們僅僅是最近的鄰居。

+0

關於通過互聯網搜索:inside-R通過R包文檔,[搜索hotdeck](http://www.inside-r.org/search/node/hotdeck)或[hot deck](http: //www.inside-r.org/search/node/hot%20deck)的結果很少。 – Marek 2011-05-31 09:26:59

+0

谷歌一直比R更好(至少對我來說)。這是我做的搜索:http://www.google.com/search?client=ubuntu&channel=fs&q=hot+deck+imputation+r&ie=utf-8&oe = UTF-8 – 2011-05-31 12:18:34

1

我不知道是否有一個現成的R時包,但是這不會把戲:

dfr<-data.frame(c1=c(123,132,388,792,2737,2741,2929,3396,3517,3546), 
c2=c(0.244,0.194,0.47,0.105,0.199,0.115,0.087,0.190,0.163,0.123), 
c3=c(NA, 0.193,0.149, NA, 0.201, NA, 0.083,0.187,0.163,NA)) 

hdidx<-which(!is.na(dfr[,3])) 
hd<-dfr[hdidx,] 
md<-dfr[-hdidx,] 
closesthd<-sapply(md[,2], function(curval){which.min(abs(curval-hd[,2]))}) 
md[,3]<-hd[closesthd,3] 

在需要的地方進行你的情況也許+採取另一種距離度量替換列數。