R: Помощь в работе с несколькими data.frames и mapply

У меня есть два файла данных, состоящие из 8 строк, 2151 столбца. Я хочу сделать регрессию между каждым файлом, для каждого столбца и вывести значения наклона, точки пересечения и r-квадрата. Пример: выполните регрессию столбца 1 файла 1 (все 8 строк) и столбца 1 файла 2 (все 8 строк), возьмите три интересующих значения (отрезок, наклон, rsquared) и перейдите к следующему набору столбцов для оба файла.

@thelatemail дал мне огромный кусок кода, который делает почти все.

mapply(function(x,y) coef(lm(y~x)), input1, input2

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

linear_calibration <- function(x,y) {
   co_values <- coef(lm(y~x))
   return(co_values)
}

test_output = mapply(linear_calibration(input1, input2))
write.table(test_output,file="dump.csv",sep=",")

К сожалению, когда я пишу это таким образом, я получаю сообщение об ошибке:

Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : 
invalid type (list) for variable 'y'

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


person user1819274    schedule 18.05.2014    source источник
comment
Вы устали rbind от объединения столбцов? Кроме того, было бы очень полезно опубликовать воспроизводимый пример с кодами - см. [ссылка] (stackoverflow.com/questions/5963269/) для более подробной информации.   -  person John_dydx    schedule 19.05.2014
comment
merge Думаю, это правильный шаг, но вам нужно будет привести пример, чтобы мы могли вам помочь.   -  person Hugh    schedule 19.05.2014
comment
Если вы планируете провести регрессионный анализ 2151 и получить значимые результаты, я серьезно пересмотрю то, что вы делаете.   -  person thelatemail    schedule 19.05.2014
comment
@thelatemail Не делай этого. К сожалению, характер моей задачи требует выполнения регрессии для каждой пары столбцов. В основном мне приходится вытягивать наклон, точку пересечения и R2 из каждой регрессии. Просто попытаться понять, как справиться со зверем, - сложная часть!   -  person user1819274    schedule 19.05.2014


Ответы (1)


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

input_1$ID <- 1:8
input_2$ID <- 1:8

Затем combined <- merge(input_1, input2, by="ID", all.x=TRUE, all.y=TRUE)

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

df <- cbind(input_1[1], input_2[1])
model <- lm(df[,1] ~ df[,2])

надеюсь, это поможет

person Sean Murphy    schedule 19.05.2014
comment
Супер полезно! Я думаю, что сейчас я на правильном пути. Все, что мне нужно сделать, это создать несколько циклов вокруг этой штуки, и, надеюсь, она сможет работать и выдавать нужные мне числа. - person user1819274; 19.05.2014
comment
@user1819274 user1819274 - mapply(function(x,y) coef(lm(y ~ x)) ,input_1,input_2) нет необходимости в циклах и тому подобном. - person thelatemail; 19.05.2014
comment
@thelatemail Святая корова, большое спасибо. Это какое-то серьезное R-fu, которого мне не хватает. - person user1819274; 19.05.2014
comment
@user1819274 user1819274 - всякий раз, когда вам нужно сравнить первый, второй, третий и т. д. компоненты двух или более списков/векторов/data.frames и т. д., mapply/Map часто может пригодиться. - person thelatemail; 19.05.2014
comment
@thelatemail Да, я сейчас читаю функции применения. Действительно потрясающие вещи. Я все еще поражен тем, что одна строка кода делает все, что мне нужно, и вот я возился с этим неуклюжим POS, который я делал. Но ответы от всех были очень ценны. - person user1819274; 19.05.2014