для циклов для регрессии по нескольким переменным и вывода подмножества

Я попытался применить этот QA: «эффективная циклическая логистическая регрессия в R» к моей собственной проблеме, но я не могу заставить ее работать. Я не пробовал использовать apply, но несколько человек сказали мне, что цикл for здесь лучший (если кто-то считает иначе, не стесняйтесь объяснять!) Я думаю, что эта проблема довольно обобщаема и не слишком эзотерична для Форум.

Вот чего я хочу достичь: у меня есть набор данных с 3 переменными-предикторами (пол, возраст, раса) и зависимой переменной (пропорцией) для 86 генетических позиций для нескольких человек. Я хочу запустить двумерную линейную регрессию для каждой позиции (то есть 86 линейных регрессий для 3 переменных-предикторов). Затем я хочу вывести результаты в удобочитаемом формате; Моя идея - матрица, в которой строки = пол, возраст и раса, а столбцы = 86 позиций. Для каждой комбинации строка * столбец будет значение p. Затем я мог бы назвать значения p <0,1 (или любой другой порог, который я хочу), чтобы легко увидеть, какие предикторы существенно связаны с пропорцией в каждой позиции.

Это код, который у меня есть.

BB <- seq.csv[,6:91]   #the data frame containing the 86 positions
AA <- seq.csv[,2:4]    #the data frame containing the 3 predictor variables

linreg <- matrix(NA,3,86)  #make a results vector and fill it with NA
    for (i in 1:86)     #loop over each position variable
    {
              for (j in 1:3)  #for each position variable, loop over each predictor
    {
              linreg[i,j] <- lm(BB[,i]~AA[,j])  #bivariate linear regression
}}

Независимо от того, как я это изменяю (например, упрощая его, чтобы перебирать позиции только для одного предиктора), я все равно получаю сообщение об ошибке, что мои матрицы не одинаковой длины (количество заменяемых элементов не кратно длине замены) . Фактически, длина (линрег) = 286 (3 * 86), длина (BB) = 86 и длина (AA) = 3. Я знаю, что последние два являются фреймами данных, а не матрицами ... но если я конвертирую их в матрицы, я получаю ошибку недопустимого типа (недопустимый тип (список) для переменной 'BB [, i]'). Я не знаю, как исправить эту ошибку, потому что я просто недостаточно хорошо понимаю R ... Я проконсультировался с книгами Прикладная статистическая генетика с R и Искусство программирования на R безрезультатно, и я весь день искал в Google. А я еще даже не дошел до кодировки вывода результатов ...

Я был бы признателен за любые советы по отладке или некоторые предложения по лучшему способу кодирования этого! Спасибо всем заранее.


person Jess    schedule 08.03.2013    source источник
comment
Я думаю, вам нужно поговорить со статистиком. Я думаю, что вы заблуждаетесь, и вам нужно лучше разобраться в проблемах, прежде чем пытаться самостоятельно писать код.   -  person IRTFM    schedule 09.03.2013
comment
Вам будет легче помочь, если вы опубликуете часть структуры своих данных. Попробуйте вставить вывод из dput( head( BB[,6:10] ) ) и dput( head( AA ) ).   -  person Simon O'Hanlon    schedule 09.03.2013
comment
Это похоже на некоторые из тех прискорбных вещей, которые я сделал в своей докторской степени ... Пожалуйста, поговорите с консультантом по статистике!   -  person alexwhan    schedule 09.03.2013


Ответы (1)


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

df <- cbind( AA[ , 2:4 ] , BB[ , 6:91 ] )
mods <- apply( as.data.frame( df[ , 4:89 ] ) , 2 , FUN = function(x){ lm( x ~ df[,1] + df[,2] + df[,3] } )

# The rows of this matrix will correspond to the intercept, gender, age, race, and the columns are the results for each of your 86 genetic postions
pvals <- sapply( mods , function(x){ summary(x)$coefficients[,4] )

Что касается того, правильно это делать, я доверяю вашему суждению как генетическому эпидемиологу!

person Simon O'Hanlon    schedule 08.03.2013
comment
О, это определенно неправильно. Это было частью ротации лаборатории - в мою ответственность входила только лабораторная работа. Теперь, когда у меня есть данные, моя обязанность состоит в том, чтобы просто изучить R. Я определенно осведомлен о проблемах множественного тестирования, коррелированных данных и других актуальных проблемах. Но это не для моей диссертации - как только я узнаю, что мне нужно в R, данные исчезнут без следа! - person Jess; 09.03.2013
comment
@ user2100907 Если это не то, что вы искали, оставьте комментарий, чтобы я мог обновить решение тем, что вы хотите сделать. :-) Ваше здоровье - person Simon O'Hanlon; 10.03.2013
comment
Большое спасибо - этот код делает то, что я хотел достичь, с небольшим изменением (включая конечную скобку} в векторном коде pval перед финалом) - person Jess; 10.03.2013