预测R中数据帧的值

时间:2016-10-06 14:26:10

标签: r dataframe lm predict

您好我有一个巨大的数据框( df ),其名称是不同的Tenors,在列中我有每个男高音的值。对于最后两个期限,我有一些缺失的行,我想根据非缺失行的给定数据完成这些行。我的数据框看起来像这样:

  1095          1825        2555        3650        5475        7300        10950
  0.00116034    0.00170552  0.00274189  0.00472176  0.00697495  NA          NA
  0.00112157    0.00188056  0.00295159  0.0050669   0.00728063  0.00816778  0.00842034
  0.00138009    0.00225073  0.00339548  0.00549386  0.00780401  0.00871812  0.00897222

我被困在使用predict()和lm。 我想获得那些缺失的价值观。 对不起这个基本问题,但我很着急,而且我已经被困了一个多小时。

提前致谢。

修改  我想用数据框创建一个线性模型,比方说df2

   df2 <-df[rowSums(is.na(df)) > 0,])

使用预测找到7300,10950的缺失值。

EDIT2:

感谢@Zheyuan Li,我已经取得了一些进展,但我无法获得预测数据,我尝试使用两个选项:

b<-setNames(stack(df2),c("value", "Tenor"))
data.lm <- lm(value~Tenor, data = b, na.action = na.exclude)
pred<-predict(data.lm)

如果我执行此代码,我会使用与b相同的值获取pred。

另一方面,如果我使用以下代码,我会获得所有预测值的相同值。

aov <- aov(data.lm,data=b)
pred<-predict(aov)

EDIT3:

我已经调整了我的代码并删除了最后一列以简化操作。 现在我有以下数据:

  1095          1825        2555        3650        5475        7300        
  0.00116034    0.00170552  0.00274189  0.00472176  0.00697495  NA          
  0.00112157    0.00188056  0.00295159  0.0050669   0.00728063  0.00816778  
  0.00138009    0.00225073  0.00339548  0.00549386  0.00780401  0.00871812  

我的新代码如下:

setDT(df)


variables<-setdiff(names(df),c('7300',"DATE"))

y_var<-"7300"
Line<-function (train_dat, test_dat, variables, y_var, family = "gaussian") 
{
  fm <- as.formula(paste(y_var, " ~", paste(variables, collapse = "+")))
  glm1 <- glm(fm, data = train_dat, family = family)
  pred <- predict(glm1, newdata = test_dat)
  return(pred)
}

df[is.na(`7300`),`7300`:=
         Line(train_dat=df[!is.na(`7300`),],
              test_dat=df[is.na(`7300`)],
              variables,
              y_var)
       ]

现在我收到以下错误:

Error in terms.formula(formula, data = data) : 
  invalid term in model formula

你知道怎么解决吗?

1 个答案:

答案 0 :(得分:0)

我不确定这是您正在寻找的内容,但是您可以使用示例数据集来判断一些丢失的数据

data(mtcars) #pulling in some data to help out

# setting up missing data -------------------------------------------------
set.seed(1)
setDT(mtcars) #i like to work in data.table
sa<-sample(2,nrow(mtcars),prob=c(.1,.9),replace=T)
mtcars[,mpg_na:=mpg]
mtcars[sa==1,mpg_na:=NA]

现在我们有一些缺失的数据!

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb mpg_na
 1: 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4   21.0
 2: 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4   21.0
 3: 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1   22.8
 4: 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1     NA
 5: 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2   18.7 
 6: 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1   18.1 
 7: 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4     NA 

# function to predict using linear model ----------------------------------------

Line<-function (train_dat, test_dat, variables, y_var, family = "gaussian") 
{
  fm <- as.formula(paste(y_var, " ~", paste(variables, collapse = "+")))
  glm1 <- glm(fm, data = train_dat, family = family)
  pred <- predict(glm1, newdata = test_dat)
  return(pred)
}

variables<-setdiff(names(mtcars),c('mpg','mpg_na'))
y_var<-'mpg'

mtcars[!is.na(mpg_na),mpg_pred:=mpg] #setting up 
mtcars[is.na(mpg_na),mpg_pred:=
         Line(train_dat=mtcars[!is.na(mpg_na),],
              test_dat=mtcars[is.na(mpg_na)],
              variables,
              y_var)
       ]

我们是怎么做的?

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb mpg_na mpg_pred
 1: 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4   21.0 21.00000
 2: 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4   21.0 21.00000
 3: 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1   22.8 22.80000
 4: 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1     NA 21.48683
 5: 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2   18.7 18.70000
 6: 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1   18.1 18.10000
 7: 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4     NA 16.91128

还有其他观察结果,但这里显示的两个(第4行和第7行)看起来相当接近