генерировать суррогатные данные в R - PullRequest
0 голосов
/ 04 марта 2019

У меня есть двоичный временной ряд с 359 наблюдениями.как это;0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 ... Я хочу сгенерировать n выборок данных с теми же интервалами, но с перестановочным порядком.Для этого я сначала обнаружил, что исходные данные становятся равными нулю примерно так:

147 65 10 251

, а затем рандомизировал порядок интервалов примерно так:

251 10 65 147
10  251  147 65
.
. 
.

и т. Д.Пока мой код выглядит примерно так:

mydata <- "C:/Users/me/Desktop/2.xlsx"
library("xlsx")
library("tseries")
my_data <-  read.xlsx(mydata, sheetName = "Sheet1", header = F)
file <- "C:/Users/me/Desktop/pp.xlsx"
ts=my_data[6]
ts=unlist(ts)

for (i in 1:100){
  diff.ts<-diff(ts)
  x=sample(diff(which(diff.ts==1)))
  print(x)
  write.xlsx(x,file[i], sheetName = "Sheet1",col.names=TRUE, row.names=FALSE, append=FALSE, password=NULL)
}

, однако,

  1. Я не могу сохранить все эти файлы в файле .xlsx, хотя при печати они выглядят нормально
  2. Моя вторая проблема заключается в том, что я не только хочу знать, в какое время произошло 0: 1, но также хочу записать их в качестве исходных данных, например, если в одной из рандомизированных выборок интервалы составляют 10 251 147 65Мне нужен сохраненный столбец с 1 в 10-й, 251-й, 147-й и 65-й строке в качестве одной, а другой строки в виде нуля примерно так:

    0 0 0 0 0 0 0 0 0 1 0 0 .....

Извините за английские ошибки

1 Ответ

0 голосов
/ 04 марта 2019

Цель интервала неясна, и на ваш перестановочный вопрос об интервале, возможно, будет дан ответ с помощью функции sample () ниже, которая случайным образом выберет распределение 1 и 0.Вы также можете отрегулировать вероятности изменения, выбрав 0 или 1, здесь это 50/50%.Кроме того, если вы хотите получить случайную выборку, но для того, чтобы убедиться, что ваш код повторяется, вы можете принудительно использовать случайную начальную величину в своем сеансе, чтобы каждый раз рисовать одну и ту же перестановку с помощью: set.seed(123456), выбирая любое начальное число, которое вы считаете подходящим.

sample(x=c(0,1),size=359,replace=T,prob=c(0.5,0.5))

В качестве альтернативы, ваш вопрос может предлагать установить значения, равные 1, для определенного индекса.Здесь для вашего примера 147,65,10,251 вы можете сделать:

intervals <- rep(0,359)
intervals[c(147,65,10,251)] <- 1

Или, может быть, так?

intervals <- rep(0,359)
intervals[sample(c(147,65,10,251))]  <- 1

Поскольку это вопрос из двух частей и ответ на вашПроблема записи Excel: у вас есть файл write.xlsx, вызванный из цикла for, то есть вы записываете файл в каждом циклеЭто может или не может быть поведение, которое вы хотите?Я предполагаю, что запись всего набора данных предпочтительнее.Однако если вы укажете file [i] в ​​качестве выходных данных, а ваша переменная file будет одним значением (или вектором одной длины), вы получите ошибки.Вы измените это в файле write.xlsx на write.xlsx(x,paste0("my_file_num",i,".xlsx"), ... или переместите вызов за пределы цикла, как показано ниже

file <- "C:/Users/me/Desktop/pp.xlsx"
ts=my_data[6]
ts=unlist(ts)
samples <- NULL
for (i in 1:100){
  diff.ts<-diff(ts)
  x=sample(diff(which(diff.ts==1)))
  samples <- append(samples,list(samples=x))
  print(x)
}

  write.xlsx(samples,file, sheetName = "Sheet1",col.names=TRUE, row.names=FALSE, append=FALSE, password=NULL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...