Применение lm () с использованием sapply или lapply - PullRequest
0 голосов
/ 14 марта 2020

Так что я пытаюсь использовать lm () с sapply.

#example data and labels
data <- matrix(data = runif(1000), nrow = 100, ncol = 10))
markers <- sample(0:1, replace = T, size = 100)

# try to get linear model stuff
Lin <- sapply(data, function(x) lm(unlist(markers) ~ unlist(x))$coefficients)

МОЯ проблема в том, что это дает мне коэффициенты для 1000 уравнений, а не 10

1 Ответ

1 голос
/ 14 марта 2020

Вам необходимо предоставить sapply фрейм данных, а не матрицу.

#example data and labels
data <- data.frame(matrix(data = runif(1000), nrow = 100, ncol = 10))
markers <- sample(0:1, replace = T, size = 100)

# try to get linear model stuff
sapply(data, function(x) coef(lm(markers ~ x)))    
sapply(data, function(x) coef(lm(markers ~ x))[-1]) # Omit intercepts
        X1.x         X2.x         X3.x         X4.x         X5.x 
 0.017043626  0.518378546 -0.011110972 -0.145848478  0.335232991 
        X6.x         X7.x         X8.x         X9.x        X10.x 
 0.015122184  0.001985933  0.191279594 -0.077689961 -0.107411203

Ошибка исходной матрицы:

data <- matrix(data = runif(1000), nrow = 100, ncol = 10)
sapply(data, function(x) coef(lm(markers ~ x)))    
# Error: variable lengths differ (found for 'x')

Поскольку sapply, который вызывает lapply, преобразует свой первый аргумент X в список, используя as.list перед выполнением функции. Но as.list, примененный к матрице, приводит к списку с длиной, равной количеству записей в матрице, в вашем случае 1000. as.list при применении к фрейму данных в результате получается список, длина которого равна числу столбцов фрейма данных, в вашем случае 10, с элементами, содержащими значения в каждом столбце.


> lapply
function (X, FUN, ...) 
{
    FUN <- match.fun(FUN)
    if (!is.vector(X) || is.object(X)) 
        X <- as.list(X)
    .Internal(lapply(X, FUN))
}
<bytecode: 0x000002397f5ce508>
<environment: namespace:base>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...