2016-10-06 6 views
-1

Salut j'ai une immense dataframe (df) dont les noms sont différents Tenors, dans les colonnes j'ai des valeurs pour chaque ténor. Pour les deux derniers ténors, j'ai quelques lignes manquantes que je veux compléter en fonction des données données pour les lignes non manquantes. Mon image ressemble à ceci:Prédire les valeurs de dataframe dans 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 

Je suis bloqué en utilisant predict() et lm. Je veux obtenir ces valeurs manquantes. Désolé pour cette question de base, mais je suis pressé et j'ai été bloqué pendant plus d'une heure.

Merci d'avance.

EDIT Je veux créer un modèle linéaire avec une trame de données, permet de dire DF2

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

Et utiliser prédis trouver les valeurs manquantes pour 7300, 10950.

EDIT2:

Grâce à @Zheyuan Li j'ai connu des progrès, mais je ne peux pas obtenir mes données prédites, j'ai essayé d'utiliser deux options:Si j'exécute ce code, j'obtiens le pred avec les mêmes valeurs que b. En revanche, si j'utilise le code suivant, j'obtiens les mêmes valeurs pour toutes les valeurs prédites.

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

EDIT3:

J'ai adapté mon code et enlevé la dernière colonne pour faciliter les choses. Maintenant, j'ai les données suivantes:

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 

Mon nouveau code ressemble à ceci:

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) 
     ] 

Maintenant, je reçois l'erreur suivante:

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

Savez-vous comment le résoudre ?

+0

Si vous voulez imputer sur la base du 'mean',' median' etc d'un colonne, cocher 'na.aggregate' from' zoo' – akrun

+0

Je veux créer le modèle linéaire basé sur les lignes avec des données complètes. Je ne veux pas seulement extrapoler basé sur les noms de l'image, mais utiliser les mêmes mouvements pour les lignes connues. Est-ce clair? – arodrisa

+0

bien, vous devriez travailler sur la transposée de votre data.frame ... – agenis

Répondre

0

Je ne suis pas certain que c'est ce que vous cherchez, mais voici comment vous pouvez attribuer des données manquantes à l'aide d'un ensemble d'échantillons de données

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] 

nous avons maintenant des données manquantes!

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) 
     ] 

Comment avons-nous fait ???

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 

Il y a d'autres observations à regarder mais les deux montrés ici (ligne 4 et 7) regarder raisonnablement près

+0

merci pour le morceau de code, j'ai rendu mon code similaire, mais toujours avoir une erreur. J'ai édité la question – arodrisa