Существует ли общий метод для моделирования данных из формулы или анализа?

16

De novo моделирование данных из экспериментальной модели данных.
С акцентом на R (хотя другое языковое решение было бы здорово).

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

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

Однако этот процесс, как правило, несколько утомителен, и многие вынуждены пропустить этот важный шаг в эксперименте или опросе.

Статистические модели и тесты содержат большую часть информации, необходимой для моделирования данных (включая допущение или явное изложение распределения).

Учитывая модель анализа (и связанные с ней допущения, например, нормальность и баланс), уровни фактора и меру значимости (например, p-значение), я хотел бы получить смоделированные данные (в идеале с обобщенной функцией, схожей с print (), прогнозировать (), моделировать ()).

Возможна ли такая обобщенная схема моделирования?

Если да, доступна ли такая структура в настоящее время?

Например, я хотел бы функцию, такую ​​как:

 sim(aov(response~factor1+factor2*factor3),
          p.values=list(factor1=0.05,
                        factor2=0.05,
                        factor3=0.50,
                        factor2:factor3=0.05),
          levels=list(factor1=1:10,
                      factor2=c("A", "B", "C"),
                      factor3=c("A", "B", "C")))

то есть обобщенная версия:

sim.lm<-function(){
library(DoE.base)
design<-fac.design(nlevels=c(10,3,3),
                   factor.names=c("factor1", "factor2", "factor3"),
                   replications=3,
                   randomize=F)

response<-with(design, as.numeric(factor1)+
                      as.numeric(factor2)+
                      as.numeric(factor3)+
                      as.numeric(factor2)*as.numeric(factor3)+
                      rnorm(length(factor1)))

simulation<-data.frame(design, response)}

ИЛИ

sim(glm(response~factor1+factor2*factor3, family=poisson),
         p.values=list(factor1=0.05,
                       factor2=0.05,
                       factor3=0.50,
                       factor2:factor3=0.05),
         levels=list(factor1=1:10,
                     factor2=c("A", "B", "C"),
                     factor3=c("A", "B", "C")))

ИЛИ

  library(lme4)
  sim(lmer(response~factor1+factor2 + (factor2|factor3)),
           F_value=list(factor1=50,
                        factor2=50),
           levels=list(factor1=1:10,
                       factor2=c("A", "B", "C"),
                       factor3=c("A", "B", "C")))

это создаст полный соответствующий data.frame

возможные примеры конкретных функций (пожалуйста, редактируйте по желанию)
- arima.sim

Функция существует для создания data.frame уровней факторов без смоделированного ответа:
например. conf.design
http://cran.r-project.org/web/views/ExperimentalDesign.html

Этьен Лоу-Декари
источник
Следует иметь в виду, что вам нужно указать распределение ошибок. Кроме того, я не полностью слежу за вашими списками "p.values" или "F_value"; Является ли идея, чтобы выборочные распределения F & p были сосредоточены на перечисленных числах?
gung - Восстановить Монику
@ gung, в тесте предполагается распределение (оба здесь предполагают нормальность, иначе мне пришлось бы использовать что-то вроде glm).
Этьен Лоу-Декари
Тест , конечно же предполагает распределение специфического, но это не означает , что данные были на самом деле генерируются таким образом. Вы можете генерировать данные из любого количества распределений для различных целей (например, исследования моделирования, устойчивость и т. Д.).
gung - Восстановить Монику
@ gung, я попытался отредактировать свой вопрос, чтобы понять, что я хочу создать набор данных, который соответствует ожиданиям теста / модели. Я не ищу что-то для симуляционного исследования или исследования устойчивости, но для того, чтобы обеспечить пробный запуск экспериментального проекта.
Этьен Лоу-Декари
stats.stackexchange.com/questions/11233/…
Этьен Лоу-Декарни

Ответы:

10

На самом деле есть универсальный S3, simulateкоторый даже возвращает нужный вам фрейм данных (или другой список). Тип

?simulate  

У него уже есть методы для классов lm (работает также для glm или для вашего примера aov) и glm.nb (в MASS). Теперь вы можете написать simulateметоды S3 для других классов объектов, например, для объектов из lme4. Вы можете проверить, для каких классов есть методы, набрав

getAnywhere("simulate.class"), getAnywhere("simulate")  

или

getS3method("simulate","class"), methods(simulate) 
Момо
источник
моделирование было бы замечательно, если бы для этого не требовался «объект, представляющий подобранную модель», который сам по себе уже требует данных или данных моделирования.
Этьен Лоу-Декари
>getAnywhere("simulate.class") no object named ‘simulate.class’ was found >getS3method("simulate","class") Error in getS3method("simulate", "class") : S3 method 'simulate.class' not found
Этьен Лоу-Декари
2
Можно всегда построить начальный подобранный объект со всеми значениями отклика, скажем, 0, и заменить коэффициенты в подгонке желаемыми значениями параметров. Затем смоделированные ответы могут быть получены с помощью «моделирования».
NRH
Это правда. Пакеты в представлении [экспериментальная задача разработки] ( cran.r-project.org/web/views/ExperimentalDesign.html ) содержат множество пакетов для создания фиктивной настройки переменной. Интеграция функций моделирования и экспериментального дизайна была бы великолепной!
Этьен Лоу-Декари
Некоторые функции имитации не создают данные только для подбора
Этьен Лоу-Декарни
6

В пакете для R появилась новая функция ( simfunв TeachingDemosнастоящее время она только в версии для разработчиков на R-forge , пройдет некоторое время, прежде чем она будет на CRAN). Он предназначен для помощи в создании функций для симуляции.

Одним из предполагаемых применений является то, что учитель будет использовать simfunФункция для создания функции и распространения ее среди учащихся (возможно, в какой-то момент может иметь веб-интерфейс). Затем учащиеся должны создать фрейм данных о факторах, представляющих экспериментальный дизайн, передать этот фрейм данных созданной функции и получить фрейм данных с дополнительным столбцом ответа, смоделированного в соответствии с параметрами и распределением ошибок, установленными учителем. Затем студент может проанализировать данные. Это позволяет учителю установить «истинные» отношения, но позволяет учащимся испытать множество различных экспериментальных схем, чтобы исследовать способы достижения «Истины» за гораздо меньшее время, чем в реальном эксперименте и требовать меньше работы для учителя, чем создать или найти набор различных образцов данных, представляющих различные возможные проекты.

simfunФункция предназначена быть гибким, учитель / создатель может основывать моделирование на подогнанной регрессионной модели, параметры , предоставленные учителя / создателя, или параметры suplied студенческим / пользователя.

Созданную функцию также можно легко использовать в симуляции (с помощью replicateкоманды) для изучения мощности, размера выборки, размера эффекта и т. Д. Хотя полученное моделирование может быть медленнее, чем ручное создание процесса моделирования.

Это похоже на то, что вы описываете, за исключением того, что для создания данных не требуются p-значения, но можно использовать power.функции или pwr.из pwrпакета для создания симуляций, основанных на указании мощности и альфа, а не на средствах и различиях.

Вот пример со страницы справки (есть еще несколько примеров), который предполагает, что вы измеряете высоту объектов (мужского и женского пола), которые вложены в города, вложенные в государства, существует случайный эффект для государства с SD 1 и случайный эффект для города (в пределах штата) с SD 0,5, тогда SD «ошибки» равен 3, у женщин среднее значение моделирования составляет 64 дюйма, а у мужчин среднее значение составляет 69 дюймов (ошибка SD и средства реалистичны , случайные эффекты немного надуманные). simfunФункция используется , чтобы создать новую функцию под названием simheight, то кадр данных создаются с государством ID, города идентификаторов и колонками для пола субъекта (экспериментального проектирования или дизайна выборки), это передаютсяsimheight и результат в новом фрейме данных с имитированными высотами (в дополнение к другим переменным), который затем может быть проанализирован с использованием соответствующих инструментов.

# simulate a nested mixed effects model
simheight <- simfun({
  n.city <- length(unique(city))
  n.state <- length(unique(state))
  n <- length(city)
  height <- h[sex] + rnorm(n.state,0,sig.state)[state] + 
    rnorm(n.city,0,sig.city)[city] + rnorm(n,0,sig.e)
}, sig.state=1, sig.city=0.5, sig.e=3, h=c(64,69),
  drop=c('sig.state','sig.city','sig.e','h','n.city','n.state','n'))

tmpdat <- data.frame(state=gl(5,20), city=gl(10,10), 
  sex=gl(2,5,length=100, labels=c('F','M')))
heightdat <- simheight(tmpdat)
Грег Сноу
источник
Кажется, я не могу найти новые TeachingDemos в R-Forge?
Этьен Лоу-Декари
1
install.packages ("TeachingDemos", repos = " R-Forge.R-project.org" )
Этьен Лоу-Декарни
Попробуй install.packages("TeachingDemos", repos="http://R-Forge.R-project.org"). Вам нужно "http: //" в начале и без ";".
Грег Сноу
3

Печатание methods(simulate)или getAnywhere("simulate")должно работать. Первый дает вам несколько методов, если загружен пакет lme4:

[1] simulate.lm * simulate.merMod * simulate.negbin * simulate.polr *

Lm-объекты используются как для моделей lm, так и для glm.

JTT
источник
2
Спасибо, но это похоже на ответ @ Momo.
Этьен Лоу-Декари