R: Bien appeler une variable qui contient "i"

0

La question

Je travaille avec le R langage de programmation. J'ai le code suivant qui crée de 100 ensembles de données (contenant une composante fixe et une composante aléatoire):

a = rnorm(300,10,5)
b = rnorm(300,3,1)
c = rnorm(300,12,1)
e = "original"
d = data.frame(a,b,c,e)


results <- list()

for (i in 1:100){

a = rnorm(100,10,10)
b = rnorm(100,10,10)
c = rnorm(100,10,10)
e = "simulated"

d_i = data.frame(a,b,c,e)

data_i = rbind(d, d_i)
data_i$iteration = i
 results[[i]] <- data_i

}



results_df <- do.call(rbind.data.frame, results)

Pour le moment, ces 100 jeux de données ont tous été placés dans le même fichier ("results_df"). Maintenant, j'ai envie de casser la "results_df" fichier dans chacun de ces 100 jeux de données (à l'aide de la "itération" colonne de l'index):

results_df$iteration = as.factor(results_df$iteration)
X<-split(results_df, results_df$iteration)

Ce "X" fichier semble être une "liste" avec chacun des 100 ensembles de données énumérées comme suit:

enter image description here

Je peux accéder à chacun de ces fichiers par l'appel de la "index" à l'aide de i , par exemple

> head(X$`1`)
          a        b        c        e iteration
1  2.141495 3.984072 12.73344 original         1
2  8.769269 4.267464 11.32566 original         1
3  5.413573 2.823608 12.06713 original         1
4 11.710470 3.710500 12.20715 original         1
5 14.423155 2.944178 10.56673 original         1
6  6.886629 2.843195 12.43074 original         1
> head(X$`2`)
            a        b        c        e iteration
401  2.141495 3.984072 12.73344 original         2
402  8.769269 4.267464 11.32566 original         2
403  5.413573 2.823608 12.06713 original         2
404 11.710470 3.710500 12.20715 original         2
405 14.423155 2.944178 10.56673 original         2
406  6.886629 2.843195 12.43074 original         2
> head(X$`98`)
              a        b        c        e iteration
38801  2.141495 3.984072 12.73344 original        98
38802  8.769269 4.267464 11.32566 original        98
38803  5.413573 2.823608 12.06713 original        98
38804 11.710470 3.710500 12.20715 original        98
38805 14.423155 2.944178 10.56673 original        98
38806  6.886629 2.843195 12.43074 original        98

Ma Question: j'ai maintenant envie d'écrire une fonction qui effectue la régression linéaire sur chacun de ces 100 jeux de données, enregistre les coefficients de régression, et les place dans un fichier unique. J'ai essayé d'écrire le code de cette:

results_1 <- list()

for (i in 1:100){

model_i <- lm(a ~ b +c, data = X$`i`)
coeff_i = model_i$coefficients

 results_1[[i]] <- coeff_i 

}

results_df_1 <- do.call(rbind.data.frame, results_1)

À première vue, cela semble avoir fonctionné, mais il s'agit de l'affichage de tous les coefficients de régression comme le même. C'est impossible, vu que le modèle de régression a été exécuté 100 fois sur différents jeux de données :

#for some reason, the column names have been corrupted

hist(results_df_1$c.14.5741211250235..14.5741211250235..14.5741211250235..14.5741211250235.., main = "first coeff")

 hist(results_df_1$c..0.105285805666629...0.105285805666629...0.105285805666629.., main = "second coeff")

 hist(results_df_1$c..0.236548691738492...0.236548691738492...0.236548691738492.., main = "third coeff")

enter image description here

Quelqu'un peut-il svp m'aider à résoudre ce problème? Lorsque vous utilisez le "split()" fonction dans R, est-ce la bonne façon "d'appeler" le "split composants" dans les futures commandes ?

model_i <- lm(a ~ b +c, data = X$`i`)

Merci!

data-manipulation function loops r
2021-11-23 05:07:10
1

La meilleure réponse

0

J'ai été en mesure de résoudre ce problème:

a = rnorm(300,10,5)
b = rnorm(300,3,1)
c = rnorm(300,12,1)
e = "original"
d = data.frame(a,b,c,e)


results <- list()

for (i in 1:100){

a = rnorm(100,10,10)
b = rnorm(100,10,10)
c = rnorm(100,10,10)
e = "simulated"

d_i = data.frame(a,b,c,e)

data_i = rbind(d, d_i)
data_i$iteration = i
 results[[i]] <- data_i

}



results_df <- do.call(rbind.data.frame, results)

X<-split(results_df, results_df$iteration)

#####

results_1 <- list()

for (i in 1:100){

#here was the problem
model_i <- lm(a ~ b +c, data = X[[i]])

coeff_i = model_i$coefficients

 results_1[[i]] <- model_i$coefficients

}

results_df_1 <- do.call(rbind.data.frame, results_1)

par(mfrow = c(1, 3))

hist(results_df_1[,1], main = "first coeff")
hist(results_df_1[,2], main = "second coeff")
hist(results_df_1[,3], main = "third coeff")

enter image description here

2021-11-23 05:48:18

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................