【发布时间】:2020-08-28 03:01:51
【问题描述】:
我有一个包含 7 列的数据框。
str(df)
'data.frame': 8760 obs. of 7 variables:
$ G1_d20_2014.SE1_ : num 25.1 25.1 25 25 25.1 ...
$ G1_d20_2014.SE4_ : num 42.4 42.3 42.3 42.3 42.3 ...
$ G1_d20_2014.SE7_ : num 34.4 34.4 34.4 34.4 34.4 ...
$ G1_d20_2014.SE22_: num 42.5 42.4 42.3 42.4 42.3 ...
$ G1_d20_2014.SE14_: num 52.5 52.5 52.5 52.5 52.4 ...
$ G1_d20_2014.SE26 : num 40.8 40.8 40.8 40.8 40.8 ...
每一列代表一个唯一的传感器,并且这些列包含来自传感器的测量数据。某些列包含缺失值。我想通过线性回归填补每列中的数据空白。我已经手动完成了此操作,但有一个非常重要的条件,我正在寻找一个可以自行执行此操作的函数,因为为所有列执行此操作需要太多时间。这是条件: 假设 G1_d20_2014_SE1 包含缺失数据。 然后我想用相关系数最高的另一个传感器的完整数据集来填补该传感器的数据空白。
这是我手动操作的方法:
我创建了一个创建指标变量的函数。如果值不是 NA,则指示变量变为 1,如果值为 NA,则变为 0。然后我将此变量作为列添加到数据集中:
Indvar <- function(t) {
x <- dim(length(t))
x[which(!is.na(t))] = 1
x[which(is.na(t))] = 0
return(x)
}
df$I <- Indvar(df$G1_d20_2014.SE1_)
接下来我查看了哪个传感器和传感器 1 之间的相关系数最高(在这种情况下,SE1 和 SE14 之间的相关系数最高)。然后我计算了线性回归,从中取出方程并将其放入一个 for 循环中,每当指标变量为 0 时,根据方程填充 NA 值:
lm(df$G1_d20_2014.SE1_ ~ df$G1_d20_2014.SE14_, data = df)
for (i in 1:nrow(df)) {
if (df$I[i] == 0)
{
df$G1_d20_2014.SE1_[i] = 8.037 + 0.315*df$G1_d20_2014.SE14_[i]
}
}
这工作得很好,但是这样做需要太多时间,因为我有很多看起来像帖子中的数据框。
我已经尝试使用 simputation 包中的 impute_lm ,但不幸的是,在填补数据空白之前,它似乎并不关心相关性最高的位置。这是我写的:
impute_fun <- impute_lm(df,
formula = SE1_ + SE4_ ~ SE14_ + SE26)
在我写SE14_ + SE26_ 时,我检查了他是否使用 SE14 中的值来估算 SE1 中的值,但他没有,因为结果与我的手动结果不同。
有什么功能可以满足我的需求吗?我真的很沮丧,因为我已经找了两个多星期了。我真的很感激一些帮助!
编辑/回复@jay.sf
所以我尝试用它制作一个函数(如下所示),但我遇到了一些困难:
我不知道如何在函数中指定我想为每一列执行此操作,并且它会从 sapply(c("SE1_", "SE2_ ", ...) 因为显然,如果我对 SE1_ 执行此操作,并且 SE1_ 仍在代码中,则相关性将为 1,并且什么也没有发生。现在您可以看到,这对于其余代码也是有问题的,例如在行 cor(df$SE1_, df[, x], use = "complete.obs")) 正如它所说的 df$SE1_ 在这里。 df$SE1_imp
我尝试像这样运行代码(但当然在 sapply(...) 中没有 SE1_),我得到了错误:df[, x] 中的错误:维数不正确。 任何想法如何解决这些问题?
impFUN <- function(df) {
corr <- sapply(c("SE1_", "SE2_", "SE4_", "SE5_","SE6_",
"SE7_", "SE12_", "SE13_","SE14_", "SE15_",
"SE16_", "SE22_","SE23", "SE24", "SE25",
"SE26", "SE33", "SE34", "SE35", "SE36",
"SE37", "SE46", "SE51", "SE52", "SE53",
"SE54", "SE59", "SE60", "SE61", "SE62",
"SE68", "SE69", "SE70", "SE71", "SE72",
"SE73","SE74", "SE82", "SE83", "SE84",
"SE85", "SE86", "SE87", "SE99","SE100",
"SE101", "SE102", "SE103","SE104",
"SE106", "SE107","SE121"), function(x)
cor(df$SE1_, df[, x], use = "complete.obs"))
imp.use <- names(which.max(corr))
regr.model <- lm(reformulate(imp.use, "SE1_"))
df$SE1_imp <-
ifelse(is.na(df$SE1_), lm.cf[1] + df[[imp.use]]*lm.cf[2], df$SE1_)
}
【问题讨论】:
-
如果我理解正确,您要做的是根据
df$G1_d20_2014.SE14为df$G1_d20_2014_中的非缺失值 建立一个线性模型以填写df$G1_d20_2014.SE1 的 i>缺失 值。与其分别预测每个缺失的数据点,不如将其向量化?例如,mod <- lm(df$G1_d20_2014.SE1_[df$I==1] ~ df$G1_d20,2014.SE14_[df$I==1]); df$G1_d20_2014.SE1[df$I==0] <- predict(mod, df$G1_d20_2014.SE14[df$I==0])
标签: r imputation