Как создать случайный набор данных с прогнозируемой вероятностью? - PullRequest
0 голосов
/ 03 июля 2019

Я изо всех сил пытаюсь сгенерировать случайный набор данных с предсказанной вероятностью полиномиальной логистической регрессии.

Давайте рассмотрим пример. Я буду использовать nnet пакет для полиномиальной логистической регрессии. Я также буду использовать wine набор данных в rattle.data пакете.

library("nnet")
library("rattle.data")
data(wine)
multinom.fit<-multinom(Type~Alcohol+Color,data=wine)
summary(multinom.fit)

Call:
multinom(formula = Type ~ Alcohol + Color - 1, data = wine)

Coefficients:
     Alcohol      Color
2  0.6258035 -1.9480658
3 -0.3457799  0.6944604

Std. Errors:
     Alcohol     Color
2 0.10203198 0.3204171
3 0.07042968 0.1479679

Residual Deviance: 222.5608 
AIC: 230.5608 

fit<-fitted(multinom.fit)
head(fit)

          1            2          3
1 0.6705935 0.0836177621 0.24578870
2 0.5050334 0.3847919037 0.11017466
3 0.6232029 0.0367975986 0.33999948
4 0.3895445 0.0007888818 0.60966664
5 0.4797392 0.4212542898 0.09900655
6 0.5510792 0.0077589278 0.44116190

Итак, набор данных fit - это 178 * 3 данных. Я хочу сгенерировать 100 случайных наборов данных, используя предсказанную вероятность. Например, первая выборка в наборе данных fit имеет вероятность около 0,67, чтобы быть «1» и от 0,08 до «2», от 0,24 до «3». Каждый образец был набран (собран?) Независимо.

Есть ли способ сделать это?

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Вы можете попробовать:

rand.list <- lapply(1:nrow(fit), function(x) sample(1:3, 100, replace = TRUE, prob = fit[x, ]))
rand.df   <- data.frame(matrix(unlist(rand.list), ncol = nrow(fit)))

Он предоставит вам data.frame со 100 наблюдениями и 178 столбцами с различными вероятностями выборки каждой строки в fit.

0 голосов
/ 05 июля 2019

Прошу прощения за неверное выражение моих слов.

Например, когда я выполняю ваш код, результаты получаются следующим образом.

head(lapply(1:nrow(fit), function(x) sample(1:3, 100, replace = TRUE, prob = fit[x, ])))
[[1]]
  [1] 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1
 [61] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1

[[2]]
  [1] 2 3 2 2 1 3 2 1 3 1 1 1 2 1 1 1 3 1 3 1 1 2 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 2 3 2 1 2 1 1 2 2 3 2 3 1 1 2 1 1 3 1 3 1
 [61] 2 1 2 1 3 1 1 1 2 3 3 1 1 3 1 3 1 1 1 1 1 1 1 1 2 3 3 2 1 1 2 1 2 1 3 3 1 1 1 2

[[3]]
  [1] 1 3 1 1 1 1 1 1 1 3 3 3 3 3 1 1 3 3 3 3 1 3 1 3 2 3 1 1 3 3 3 2 1 3 2 3 1 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 1 1 2 1 3 1 1 3
 [61] 3 3 3 3 1 1 1 3 3 3 3 1 1 1 1 1 3 1 3 1 1 3 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3

[[4]]
  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1
 [61] 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1

[[5]]
  [1] 1 3 2 1 1 1 1 1 3 2 1 2 1 2 1 1 1 3 3 3 1 2 2 3 1 1 2 1 2 1 3 3 1 1 3 3 2 3 2 1 1 2 2 1 1 1 1 1 1 2 1 3 3 1 2 2 3 1 1 1
 [61] 1 1 1 2 1 2 1 1 3 3 1 1 2 1 1 1 2 1 1 1 1 2 2 2 1 1 1 1 1 2 1 1 1 1 3 1 1 1 1 3

[[6]]
  [1] 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1
 [61] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Однако, есть ли другой способ выразить это в data.frame? когда я выполняю функцию data.frame, получается так.

head(data.frame(lapply(1:nrow(fit), function(x) sample(1:3, 100, replace = TRUE, prob = fit[x, ]))))

* Несмотря на выполнение функции head, данные были слишком длинными. Я скопировал последние две строки.

  c.3L..1L..3L..3L..3L..3L..3L..3L..3L..3L..3L..3L..3L..3L..3L..
1                                                              3
2                                                              1
3                                                              3
4                                                              3
5                                                              3
  c.3L..1L..1L..1L..3L..3L..3L..1L..1L..1L..3L..1L..1L..3L..1L..
1                                                              3
2                                                              1
3                                                              1
4                                                              1
5                                                              3
 [ reached 'max' / getOption("max.print") -- omitted 1 rows ]

Я хочу выразить данные следующим образом.

   1 2 3 4 5 .... (ommited)
1 1 1 3 1 1
2 1 1 3 1 1
3 1 3 3 1 1
4 1 3 1 1 3
5 1 1 3 1 1
... (omited)

Итак, data.frame равен 178 * 100. 178 - это номер выборки, а 100 - случайная генерация пробного номера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...