2012-03-11 3 views
0

Я предполагаю, что мне не хватает чего-то довольно простого здесь, или я полностью лаю по неправильному дереву, однако я пытался разобраться в этом в течение нескольких дней, и мой новичок R не смогли его взломать.Ссылка на значение массива из функции в R

Я ищу способ ссылки на массив значений из функции R. Я создаю моделируемое население, у меня есть возраст, пол и этническая принадлежность, и я хочу имитировать наличие диабета. У меня распространенность диабета по возрастным группам, полу и этнической принадлежности, которые я внес в 2 (пол) x11 (возрастная группа) x6 (этническая принадлежность). То, что я хочу сделать, это ссылка на правильную ячейку в массиве и ее использование с помощью runif, вызываемого для запуска теста bernoulli для каждого человека.

Код ниже текущей версии, однако я попытался несколько различных методов с разными результатами:

function(AB,sex,eth){ 

AB<-AB 
sex<- sex 
eth<-as.numeric(eth) 


#make matrix reference 
#make 'european' equal to 'other' 
eth <- ifelse(eth==7,6,eth) 
#change male from a 0 coding to a 2 for array lookup 
sex <- ifelse(sex==1,1,2) 
#remove seven from AB due to diab data starting at 30-34 age bracket 
agebracket <- AB-7 
#random number drawn 
diabbase <- runif(census$Total.Sex[AB],0,1) 
#census$total.sex gives the total number in each age bracket 

#array assignment 
arrayvalue <- Darray[agebracket,sex,eth] 

diab <- ifelse((diabbase >= (Darray[agebracket,sex,eth])) ,1,0) 
return(diab) 
} 

если я вызвать функцию из командной строки с «arrayvalue» вернулся, а не «Диаб» и отдельные значения, представленные вместо переменных (т.е. diabtest < - diabgen (10,1,1)), он возвращает правильное значение из массива, но если я отправлю переменные (т.е. diabtest < - diabgen (AB, sex, eth), он возвращает пустой пул.

Если я могу дать дополнительную информацию, которая может сделать то, что я говорю ab пожалуйста, дайте мне знать, я был бы более чем счастлив сделать это, кажется, это так просто, но он делает мою голову. Я открыт для любых предложений по другим/лучшим способам делать то же самое, любые намеки приветствуются.

+0

Первый аргумент 'runif' - это количество образцов, которые вы хотите, вероятно, 1. –

+0

Привет, Винсент, спасибо за это, но я хотел сделать случайную ничью на человека, поэтому я запустил runif через число людей в возрастной группе, а не только в одном цикле. Если бы я сделал одну случайную ничью и использовал ее для всех людей, и, например, это было очень мало, симуляция показала бы, что у каждого был диабет, спасибо за интерес. – Josh

+0

Есть ли причина, по которой вы не хотите создавать данные, с возрастом, сексом и этнической принадлежностью в качестве факторов? –

ответ

0

Это может быть, не решает проблему (я буду обновлять по мере необходимости), но это просто имитация dataframe для условий (факторов) 2x11x6

brackets <- round(seq(15, 85, length.out = 12)) 
brlabels <- character() 
for (i in 1:11) { 
    brlabels[i] <- paste(brackets[i], "to", brackets[i + 1], sep = " ") 
} 
AB <- cut(round(runif(100, 18, 80)), breaks = brackets, labels = brlabels) 

sex <- factor(sample(c(1,2), 100, replace = TRUE), levels = c(1,2), labels = c("Male", "Female")) 

eth <- factor(sample(c(1:6), 100, replace = TRUE), levels = c(1:6), labels = c("French", "German", "Swedish", "Polish", "Greek", "Italian")) 

somerandombusiness <- rnorm(100, 50, 4) 

sim.df <- data.frame(somerandombusiness) 
sim.df$AB <- AB 
sim.df$sex <- sex 
sim.df$eth <- eth 

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

Edit 1

Вы могли бы сделать что-то вроде:

runif(1,0) >= (sim.df[which(sim.df$AB=="34 to 40"&sim.df$sex=="Male"&sim.df$eth=="German"), 1]) 

Но я до сих пор не знаю, почему вы хотели бы. Во-первых, с моим методом нет способа убедиться, что все возможные комбинации перечислены. Вы могли бы увеличить размер выборки до нескольких тысяч без особых проблем, но это только сделало бы действительно возможным, что каждая комбинация существовала. В этом случае я выбрал тот, который существует.

Вы могли бы сделать это более легко с помощью чего-то вроде table(sim.df$eth, sim.df[, 1] > 60), который даст кросс-закладку всех значений somerandombusiness> 60 и различных этнических групп.

+0

Привет, Адам, Большое спасибо за усилия, которые вы вложили, я понимаю, что вы сейчас имеете в виду. Поэтому, чтобы выбрать конкретное значение для распространенности диабета в X-возрастной группе Y-пола и Z-этнической принадлежности, я бы использовал что-то вроде: ifelse (runif (1,0,)> = (sim.df [который (сим. df $ AB == "x" & sim.df $ sex == "y" & sim.df $ eth == "z")]), 0,1). Спасибо за вашу помощь, застрял в колею мышления и увидел другие варианты. – Josh

+0

Предполагая, что «somerandombusiness» - это ценность, которую мы хотим, мы можем сделать что-то вроде: «sim.df [sim.df [,« sex »] ==« Мужчина »и sim.df [,« eth »] ==" Греческий ", 1]', чтобы выбрать мужчин из Греции –

+0

Привет, Адам, чтобы объяснить, цель состоит в том, чтобы назначить двоичную переменную, чтобы указать, что имитируемый индивид либо не имеет диабета, либо не имеет диабета. У меня есть данные о распространенности из других опросов, разбитых по вышеперечисленным категориям (возрастная группа, пол, эт), которые я использую, чтобы оценить шансы человека с Х-характеристиками, имеющими диабет, что и заставляет искать ценности. Более широкая идея - создание имитированного поп-материала, основанного на новозеландских демографических данных. Следующим шагом является вменение недвоичных данных (например, кровяное давление) на основе других наборов данных. – Josh

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