拟合多个LHS的线性模型
我是R新手,我想用*apply函数来改进下面的脚本(我已经阅读了关于apply ,但是我无法设法使用它)。 我想在多个独立variables(它们是数据框中的列)上使用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 , x2和x3是协variables,而y1 , y2和y3是三个独立的响应。 您正试图拟合三个线性模型: 
 y1 ~ x1 + x2 + x3 y2 ~ x1 + x2 + x3 y3 ~ x1 + x2 + x3 
 目前,您正在使用y1 , y2 , y3循环,每次只适合一个模型。 而且你希望通过用lapplyreplacefor循环来加速这个过程。 
  我想指出,你是在错误的轨道上。  lm()是一个昂贵的操作。 只要你的数据集不小, for循环的成本是可以忽略的。 用lapplyreplace循环不会提高性能。 
 由于三种模型都具有相同的RHS,所以三种模型的模型matrix是相同的。 因此,所有模型的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 。 $fitted.values是matrix。 
 如果你有更多的协variables,你可以避免使用键入或粘贴公式.  : 
 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() 。 
跟进:
感谢您的答复。 我对概括感兴趣。 让我更具体一点。 我有一个dataframe
df,其中前n列是自variables(y1,y2,y3,....),接下来的m列是因variables(x1+x2+x3+....)。 对于n=3和m=3,fit <- lm(cbind(y1, y2, y3) ~ ., data = dat))。 但是,如何通过使用df的结构自动完成。 我的意思是类似于(for i in (1:n)) fit <- lm(cbind(df[something] ~ df[something], data = dat))。 那个“东西”我用paste和paste0创build了它。 谢谢。
 您仍然可以通过paste和paste来创build模型公式: 
 paste0("cbind(", paste(names(df)[1:n], collapse = ", "), ")", " ~ .") 
 例如,使用iris数据集: 
 paste0("cbind(", paste(names(iris)[1:2], collapse = ", "), ")", " ~ .") # "cbind(Sepal.Length, Sepal.Width) ~ ." 
 您可以将此string公式传递给lm ,因为lm将自动将其强制转换为公式类。