gpt4 book ai didi

r - svd 插补 R

转载 作者:行者123 更新时间:2023-12-02 01:22:18 27 4
gpt4 key购买 nike

我正在尝试使用 bcv 包中的 SVD 插补,但所有插补值都是相同的(按列)。

这是缺少数据的数据集 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

我哪里错了?

最佳答案

impute.svd 算法的工作原理如下:

  1. 将所有缺失值替换为相应的列均值。

  2. 计算估算矩阵的 k 近似值。

  3. 将插补位置中的值替换为步骤 2 中计算的排名 k 近似值中的相应值。

  4. 重复步骤 2 和 3,直至收敛。

在示例代码中,您设置k=min(n,p)(默认值)。然后,在步骤 2 中,rank-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

关于r - svd 插补 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35674036/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com