【问题标题】:Applying lm() using sapply or lapply使用 sapply 或 lapply 应用 lm()
【发布时间】:2020-03-14 00:27:47
【问题描述】:

所以我正在尝试将 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 中的函数将x 作为其参数,而不是data。您是要一次将一列添加到模型中还是一起添加?
  • 您的线性模型也有错误的因变量和自变量。我很确定你不需要unlist
  • @GeorgeSavva 哦,没错。已修复,但错误仍然相同
  • 你要不要:function(x) lm(markers ~ x)$coefficients
  • @Edward 是的,我只是在寻找系数

标签: r lapply sapply


【解决方案1】:

您需要为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')

因为调用lapplysapply 会在执行函数之前使用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>

【讨论】:

  • 是否按照您在评论中建议的修改,它看起来像这样并且有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-03-29
  • 2010-11-26
  • 1970-01-01
  • 2019-08-23
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
相关资源
最近更新 更多