gpt4 book ai didi

r - 拟合具有多个 LHS 的线性模型

转载 作者:行者123 更新时间:2023-12-04 16:58:36 25 4
gpt4 key购买 nike

我是 R 新手,我想用 *apply 改进以下脚本函数(我已经阅读了 apply ,但我无法使用它)。我想用lm在多个自变量(数据框中的列)上运行。我用了

for (i in (1:3) {
assign(paste0('lm.',names(data[i])), lm(formula=formula(i),data=data))
}
Formula(i)被定义为
formula=function(x)
{
as.formula ( paste(names(data[x]),'~', paste0(names(data[-1:-3]), collapse = '+')), env=parent.frame() )
}

谢谢你。

最佳答案

如果我没有误解你的意思,你正在使用这样的数据集:

set.seed(0)
dat <- data.frame(y1 = rnorm(30), y2 = rnorm(30), y3 = rnorm(30),
x1 = rnorm(30), x2 = rnorm(30), x3 = rnorm(30))
x1 , x2x3是协变量,而 y1 , y2 , y3是三个独立的 react 。您正在尝试拟合三个线性模型:
y1 ~ x1 + x2 + x3
y2 ~ x1 + x2 + x3
y3 ~ x1 + x2 + x3
目前您正在使用循环通过 y1 , y2 , y3 ,每次拟合一个模型。您希望通过替换 for 来加快进程。循环 lapply .
你在错误的轨道上。 lm()是一项昂贵的操作。只要你的数据集不小,成本 for循环可以忽略不计。更换 for循环 lapply没有性能提升。
由于所有三个模型都具有相同的 RHS( ~ 的右侧),因此三个模型的模型矩阵相同。因此,所有模型的 QR 分解只需要进行一次。 lm允许这样做,您可以使用:
fit <- lm(cbind(y1, y2, y3) ~ x1 + x2 + x3, data = dat)
#Coefficients:
# y1 y2 y3
#(Intercept) -0.081155 0.042049 0.007261
#x1 -0.037556 0.181407 -0.070109
#x2 -0.334067 0.223742 0.015100
#x3 0.057861 -0.075975 -0.099762
如果您检查 str(fit) ,你会看到这不是三个线性模型的列表;相反,它是具有单个 $qr 的单个线性模型。对象,但有多个 LHS。所以 $coefficients , $residuals$fitted.values是矩阵。生成的线性模型除了通常的“lm”类之外还有一个额外的“mlm”类。我创建了一个特别的 标签收集了一些关于主题的问题,总结为其 tag wiki .
如果您有更多协变量,则可以使用 . 避免键入或粘贴公式。 :
fit <- lm(cbind(y1, y2, y3) ~ ., data = dat)
#Coefficients:
# y1 y2 y3
#(Intercept) -0.081155 0.042049 0.007261
#x1 -0.037556 0.181407 -0.070109
#x2 -0.334067 0.223742 0.015100
#x3 0.057861 -0.075975 -0.099762
注意:不写
y1 + y2 + y3 ~ x1 + x2 + x3
这将治疗 y = y1 + y2 + y3作为一个单一的回应。使用 cbind() .

跟进:

I am interested in a generalization. I have a data frame df, where first n columns are dependent variables (y1,y2,y3,....) and next m columns are independent variables (x1+x2+x3+....). For n = 3 and m = 3 it is fit <- lm(cbind(y1, y2, y3) ~ ., data = dat)). But how to do this automatically, by using the structure of the df. I mean something like (for i in (1:n)) fit <- lm(cbind(df[something] ~ df[something], data = dat)). That "something" I have created it with paste and paste0. Thank you.


因此,您正在编写公式,或者希望在循环中动态生成/构建模型公式。有很多方法可以做到这一点,许多 Stack Overflow 问题都与此有关。通常有两种方法:
  • use reformulate ;
  • 使用 paste/paste0formula/as.formula .

  • 我更喜欢 reformulate但是,由于其简洁性,它不支持公式中的多个 LHS。 It also needs some special treatment if you want to transform the LHS .所以在下面我将使用 paste解决方案。
    为您提供数据框 df ,你可以
    paste0("cbind(", paste(names(df)[1:n], collapse = ", "), ")", " ~ .")
    更漂亮的方式是使用 sprintftoString构建 LHS:
    sprintf("cbind(%s) ~ .", toString(names(df)[1:n]))
    这是一个使用 iris 的示例数据集:
    string_formula <- sprintf("cbind(%s) ~ .", toString(names(iris)[1:2]))
    # "cbind(Sepal.Length, Sepal.Width) ~ ."
    您可以将此字符串公式传递给 lm , 如 lm将自动将其强制为公式类。或者您可以使用 formula 自己进行强制转换(或 as.formula):
    formula(string_formula)
    # cbind(Sepal.Length, Sepal.Width) ~ .
    备注:
    R 核心的其他地方也支持这个多 LHS 公式:
  • the formula method for function aggregate ;
  • ANOVA analysis with aov .
  • 关于r - 拟合具有多个 LHS 的线性模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39262534/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com