2016-10-06 4 views
-1

Привет У меня огромный размер данных (df), имена которых разные. Тензоры, в столбцах у меня есть значения для каждого тенора. Для последних двух тенор у меня есть некоторые недостающие строки, которые я хочу выполнить на основе данных для не пропущенных строк. Мой dataframe выглядит так:Предсказать значения dataframe в R

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 

Я застрял в использовании pred() и lm. Я хочу получить эти недостающие значения. Извините за этот основной вопрос, но я спешу, и я застрял более часа.

Заранее спасибо.

EDIT Я хочу создать линейную модель с кадром данных, позволяет сказать 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) 

Если я выполняю этот код, я получаю значение pred с теми же значениями, что и b.

С другой стороны, если я использую следующий код, то получаю те же значения для всех предсказанных значений.

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 

Вы знаете, как решить эту проблему ?

+0

Если вы хотите, чтобы приписывать его на основе '' mean', median' и т.д. из column, check 'na.aggregate' from' zoo' – akrun

+0

Я хочу создать линейную модель на основе строк с полными данными. Я не хочу только экстраполировать, основываясь на именах фреймворка данных, но использовать те же самые движения для известных строк. Так понятно? – arodrisa

+0

ну, вы должны работать на транспонированных данных.frame ... – agenis

ответ

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) выглядят достаточно близко

+0

спасибо за кусок кода, я сделал свой код похожим, но все еще есть ошибка. Я редактировал вопрос – arodrisa

Смежные вопросы