2016-02-27 42 views
4

我試圖使用從BCV包SVD歸集但所有的估算值相同(按列)。SVD歸集[R

這是有缺失數據的 http://pastebin.com/YS9qaUPs

#load data 
dataMiss = read.csv('dataMiss.csv') 
#impute data 
SVDimputation = round(impute.svd(dataMiss)$x, 2) 
#find index of missing values 
bool = apply(X = dataMiss, 2, is.na) 
#put in a new data frame only the imputed value 
SVDImpNA = mapply(function(x,y) x[y], as.data.frame(SVDimputation), as.data.frame(bool)) 
View(SVDImpNA) 

head(SVDImpNA) 
     V1 V2 V3 
[1,] -0.01 0.01 0.01 
[2,] -0.01 0.01 0.01 
[3,] -0.01 0.01 0.01 
[4,] -0.01 0.01 0.01 
[5,] -0.01 0.01 0.01 
[6,] -0.01 0.01 0.01 

我在哪裏錯了的數據集?發生

回答

4

impute.svd算法的工作方式如下:

  1. 與相應的柱的裝置替換所有缺失的值。

  2. 計算秩k近似的估算矩陣。

  3. 從秩k近似在步驟計算替換相應的值的估算的位置的值2.

  4. 重複步驟2和3,直到收斂。

在您的示例代碼中,您正在設置k=min(n,p)(默認值)。然後,在步驟2中,秩k近似正好等於估算矩陣。該算法在0次迭代後收斂。也就是說,該算法將所有歸算條目設置爲列均值(或者如果存在數值誤差,則與此非常接近)。

如果你想要做的比列是指歸咎於缺少的值以外的東西,你需要使用一個較小的值k。下面的代碼說明了這一點與樣品數據:

> library("bcv") 
> dataMiss = read.csv('dataMiss.csv') 

K = 3

> SVDimputation = impute.svd(dataMiss, k = 3, maxiter=10000)$x 
> table(round(SVDimputation[is.na(dataMiss)], 2)) 

-0.01 0.01 
531 1062 

k = 2時

> SVDimputation = impute.svd(dataMiss, k = 2, maxiter=10000)$x 
> table(round(SVDimputation[is.na(dataMiss)], 2)) 

-11.31 -6.94 -2.59 -2.52 -2.19 -2.02 -1.67 -1.63 
    25  23  61  2  54  23  5  44 
-1.61 -1.2 -0.83 -0.8 -0.78 -0.43 -0.31 -0.15 
    14  10  13  19  39  1  14  19 
-0.14 -0.02  0 0.01 0.02 0.03 0.06 0.17 
    83  96  94  77  30  96  82  28 
    0.46 0.53 0.55 0.56 0.83 0.91 1.26 1.53 
    1 209  83  23  28 111  16  8 
    1.77 5.63 9.99 14.34 
    112  12  33  5 

注意,對於數據,默認的最大迭代次數(100)太低(我收到一條警告消息)。爲了解決這個問題,我設置了maxiter=10000

0

你描述可能的問題,因爲impute.svd最初將所有的NA值與列均值相等,然後基於收斂不改變這些值。

這取決於你首先使用SVD插補的原因,但如果你是靈活的,這個問題的一個好的解決方案可能是通過設置k來切換SVD呼叫的等級,例如1.目前,k被自動設定爲min(N,p),其中n = nrow,和p = NcoI位,其爲數據單元K = 3。例如,如果將其設置爲1(因爲它被設置在impute.svd函數文檔中的例子),則不會發生這樣的問題:

library(bcv) 
dataMiss = read.csv("dataMiss.csv") 
SVDimputation = round(impute.svd(dataMiss, k = 1)$x, 2) 

head(SVDimputation) 
     [,1] [,2] [,3] 
[1,] 0.96 -0.23 0.52 
[2,] 0.02 -0.23 -1.92 
[3,] -1.87 -0.23 0.52 
[4,] -0.92 -0.23 0.52 
[5,] 0.49 -0.46 0.52 
[6,] -1.87 -0.23 0.52 
+0

謝謝,我已經試過這種方式,但是K是矩陣的壓縮參數,所以我猜想一個小數字會加快計算svd的近似值並用一個低秩矩陣進行插補但歸責結果不佳 – Sojers