R: Correttamente la chiamata di una variabile che contiene `i`

0

Domanda

Sto lavorando con il linguaggio di programmazione R. Ho il seguente codice che crea 100 insiemi di dati (contenente una componente fissa e una componente casuale):

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)

Al momento, questi 100 set di dati sono stati inseriti nello stesso file ("results_df"). Ora, io voglio rompere il "results_df" file in ciascuna di queste 100 set di dati (utilizzando il "iterazione" colonna di indice):

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

Questo "X" file sembra essere un "elenco" con ciascuno dei 100 set di dati elencati come segue:

enter image description here

Posso accedere a ciascuno di questi file chiamando l ' "indice" che utilizza i ad es.

> 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

La mia Domanda e: ora voglio scrivere un'altra funzione che esegue la regressione lineare su ognuno di questi 100 set di dati, consente di risparmiare i coefficienti di regressione, e li inserisce in un singolo file. Ho provato a scrivere il codice per questo:

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)

A prima vista, questo sembra aver funzionato, ma questa è la visualizzazione di tutti i coefficienti di regressione come lo stesso. Questo è impossibile, visto che il modello di regressione è stato eseguito 100 volte su diversi set di dati :

#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

Qualcuno può aiutarmi a risolvere questo problema? Quando si utilizza il "split()" la funzione in R, è questo il modo corretto per "chiamare" i "componenti split" in futuro i comandi ?

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

Grazie!

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

Migliore risposta

0

Sono stato in grado di risolvere questo problema:

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

In altre lingue

Questa pagina è in altre lingue

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