2013-06-09 2 views
0

Я имитирую несколько наборов данных, используя для цикла в R и сохраняя наборы данных в текстовых файлах в папке. Поскольку мне нужно проанализировать эти наборы данных, я импортирую эти данные из папки в R и делаю свои анализы. Мне интересно, есть ли способ сделать симуляцию и анализ, сохранив их в R в качестве фреймов данных вместо сохранения и импорта. Вот мой код:Как сохранить данные моделирования, используя для цикла в R

setwd("C:\\Users\\John\\Desktop\\datageneration") 

kitem<-10 
N<-100 
disc<-rnorm(k,0,1) 
diff=rnorm(k,0,1) 

irtp<-function(t,a,b,pexp) 
{ 
    pexp<-1/(1+exp(-b*(t-a))) 
    pexp 
} 
for(iter in 1:20) 
{ 
    X<-mat.or.vec(N,kitem) 
    P<-mat.or.vec(N,kitem) 
    for(i in 1:N) 
    { 
     theta<-rnorm(N,0,1) 
     assign(paste0("theta", iter), theta) 
     filename1 <- paste (" theta",iter ,".txt ", sep ="") 
     write.table(get(paste0("theta",iter)) , file = filename1 , row.names =FALSE ,col.names = FALSE) 
     for(k in 1:kitem) 
     { 
      P[i,k]<-irtp(theta[i],diff[k],disc[k],pexp) 
      X[i,k]<-ifelse(runif(1)<P[i,k],1,0) 
      assign(paste0("X",iter), X)   # HERE'S THE PART THAT I NEED HELP 
      filename2 <- paste ("X",iter ,".txt ", sep ="") 
      write.table(get(paste0("X",iter)) , file = filename2 , row.names =FALSE ,col.names = FALSE) 
     } 
    } 
} 

Все, что я хочу сделать, это просто использовать сгенерированные файлы данных (например, theta1, theta2, theta3 ..., theta20), называя их имена (например, theta1.). Поскольку я генерирую тысячи наборов данных, я хотел бы знать, могу ли я это сделать, не используя функции write.table then read.table. Я буду очень признателен, если вы сможете мне помочь.

+0

Являются ли ваши векторы моделирования (например, в вашем примере кода выше) или более сложными структурами? Нужно ли хранить данные, или будет ли он в порядке, просто производить, использовать и отбрасывать их? – vaettchen

+0

Спасибо за просьбу vaettchen. На самом деле мой код более сложный, чем этот. Я также создаю матрицы, которые включают в себя 100 строк и 10 столбцов, кроме того, тета-векторы. Я просто разместил этот код для простоты. Я все же хочу сохранить файлы в папке, как показано в моем коде. Но после анализа я удалю некоторые из них, которые не соответствуют моим критериям. Просто, я хотел бы сделать оба пути одновременно. Мне нравится хранить наборы данных в файле, а также использовать их без импорта. Извините за мой английский. Надеюсь, вы понимаете, что я хочу делать. –

+0

Вы переписываете файл «dat» 19 раз. –

ответ

1

Edited чтобы отразить необходимость матриц X: Создать список из 20 + 20 пунктов с данными моделирования, и имя членов соответственно:

kitem<-10 
N<-100 
disc<-rnorm(kitem,0,1) # not (k, ...) 
diff=rnorm(kitem,0,1) # not (k, ...) 
pexp <- 1     # ??? - not needed here 

# the list that takes all the produced data 
mySim <- as.list(NULL) 

# function definition reduced to the necessary 
irtp <- function(t, a, b) { 1/(1 + exp(-b * (t -a))) } 

for(iter in 1:20) 
{ 
    # create two matrices to be filled later 
    X<-mat.or.vec(N,kitem) 
    P<-mat.or.vec(N,kitem) 

    # create and name the theta component 
    theta = mySim[[ iter ]] <- rnorm(N, 0, 1) 
    names(mySim)[ iter ] <- paste ("theta", iter, sep ="") 

    # fill and save the matrices 
    for(i in 1:N) 
    { 
    for(k in 1:kitem) 
    { 
     P[i,k]<-irtp(theta[i],diff[k],disc[k]) # don"t need this: ,pexp) 
     X[i,k]<-ifelse(runif(1)<P[i,k],1,0) 
    } 
    } 
    mySim[[ 20 + iter ]] <- X 
    names(mySim)[ 20 + iter ] <- paste ("X", iter, sep ="") 
} 

Вы можете сохранить список в целом как объект R, если вы этого хотите.

Теперь вы можете адресовать каждую имитацию быть имя:

head(mySim$theta3) 
[1] 0.96068066 0.01966067 -1.25682531 -0.15128916 -0.75950710 -1.22243883 

Вы можете добавить матрицы, dataframes и т.д. к списку

mySim$tau1 <- c("lists", "take", "everything") 

Вы можете выборочно сохранять элементы списка с соответствующим именем:

filename <- paste(names(mySim)[3], ".txt", sep = "") 
write.table(mySim$theta3, filename) 

Это вы имели в виду?

+0

определенно это то, что у меня на уме. Бесконечно благодарен! Спасибо за ваше время и терпение ... –

0

Непонятно, что вы хотите сделать, но я думаю, что здесь replicate - это то, что вам нужно.

ss <- replicate(20,replicate(N,rnorm(N,0,1))) 
+0

Извините за путаницу. Предположим, что я создал 20 наборов данных (theta1 to theta20). Я могу сохранить их в папку, используя функцию write.table. Затем я могу импортировать их в R, используя функцию read.table. Ничего страшного. Но я не вижу их в R, когда я называю их имена (например, theta1) после поколения. Я просто хочу пропустить файл write.table/read.table. Просто я просто не хочу сохранять и импортировать, просто хочу использовать наборы данных непосредственно после генерации, называя их имена. –

0

Объектов в этих файлах RDA будут иметь такое же имя, «тета», так что вы не сможете загрузить их без каких-либо более ранних версий перезаписаны. Если вы хотите сохранить их без имен, вы можете использовать saveRDS и readRDS, давая им разные имена. Если вы хотите дать им разные имена, то получите save() -ed, затем используйте assign, а затем сохраните в соответствии с тем, как вы сейчас используете.

Все, что сказал, мне было бы намного проще составить список из 20 таких объектов с разными именами, а затем сохранить их все сразу и загрузить их все сразу.

N=10 
for (iter in 1:3) 
{ 
     theta<-rnorm(N,0,1) 
    assign(paste0("theta", iter), theta) 
    filename1 <- paste (" theta",iter ,".txt ", sep ="") 
    write.table(get(paste0("theta",iter)) , file = filename1 , row.names =FALSE ,col.names = FALSE) 
} 

> ls(patt="theta") 
[1] "theta" "theta1" "theta2" "theta3" 
+0

Отлично! Это то, что я искал. Большое спасибо DWin. Вы сделали мой день и спасли мои дни или недели;) –

+0

Думаю, я должен был бы поместить весь свой код, чтобы решить мою проблему. Ваше решение было в порядке для вектора тета. Я думал, что игра закончилась, но для части матрицы в моем коде я пробовал то же самое, что и для тета-вектора, но не мог получить то, что хотел. Я также хочу иметь наборы данных X1, X2 ... X20 во внутреннем цикле. Я могу совершить глупую ошибку. Я попытался поместить его в несколько разных мест, но мог бы это сделать. Я буду очень признателен, если вы скажете мне, как исправить мой код (см. Обновленный код) в создании X-части. –

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