使用 sapply 或 lapply 应用 lm()
Applying lm() using sapply or lapply
所以我正在尝试将 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 个的系数
您需要提供 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')
因为调用 lapply
的 sapply
会在执行函数之前使用 as.list
将其第一个参数 X 转换为列表。但是 as.list
应用于矩阵会导致列表的长度等于矩阵中的条目数,在您的情况下为 1,000。 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>
所以我正在尝试将 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 个的系数
您需要提供 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')
因为调用 lapply
的 sapply
会在执行函数之前使用 as.list
将其第一个参数 X 转换为列表。但是 as.list
应用于矩阵会导致列表的长度等于矩阵中的条目数,在您的情况下为 1,000。 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>