运行 R 中用户定义矩阵的 lm()
Running lm() on user defined matrix in R
我正在尝试设置一个函数,该函数将 运行 lm() 用于派生自 R 中用户定义矩阵的模型。
modelMatrix 将由用户设置,但预计结构如下:
source target
1 "PVC" "AA"
2 "Aro" "AA"
3 "PVC" "Aro"
该矩阵用于允许用户在 lm 中定义依赖(目标)和独立(源)变量,并引用另一个 valuesMatrix 的列名:
PVC Ar AA
[1,] -2.677875504 0.76141471 0.006114699
[2,] 0.330537781 -0.18462039 -0.265710261
[3,] 0.609826160 -0.62470233 0.715474554
我需要使用这个 modelMatrix 并生成相关数量的 lms。例如在这种情况下:
lm(AA ~ PVC + Aro)
和
lm(Aro ~ PVC)
我试过了,但似乎随着用户更改模型矩阵,它变得错误,我需要根据模型矩阵明确指定每个自变量。
```lm(as.formula(paste(unique(modelMatrix[,"target"])[1], "~ .",sep="")),
data=data.frame(valuesMatrix))
```
我是否需要设置 2 个循环(1 个嵌套)来获取源字符串和目标字符串并将它们粘贴到公式中,还是我忽略了一些细节。很困惑。
理想情况下,我希望用户能够更改 modelMatrix 以包含 1 个或多个 lms 以及每个 lm 的一个或多个自变量。非常感谢您的帮助,因为我真的在这里碰壁了。
谢谢。
对于您的具体示例,此代码应该有效 -
source <- c("PVC","Aro","PVC")
target <- c("AA","AA","Aro")
modelMatrix <- data.frame(source = source, target = target)
valuesMatrix <- as.matrix(rbind(c(-2.677875504,0.76141471,0.006114699), c(0.330537781,-0.18462039,-0.265710261),
c(0.609826160,-0.62470233,0.715474554)))
colnames(valuesMatrix) <- c("PVC","Aro","AA")
unique.target <- as.character(unique(modelMatrix$target))
lm.models <- lapply(unique.target, function(x) {lm(as.formula(paste(x,"~ .", sep = "")),
data = data.frame(valuesMatrix[,colnames(valuesMatrix) %in%
c(x,as.character(modelMatrix$source[which(modelMatrix$target==x)]))]))})
您可以使用 for 循环的想法,但 for 循环可能会非常昂贵,尤其是当您的 modelMatrix
变得非常大时。它可能看起来不那么吸引人,但 lapply
功能已针对此类工作进行了优化。唯一的其他技巧是保留执行 lm 所需的列。
您也可以提取每个 lm 的结果,但使用:
lm[[1]]
和 lm[[2]]
我正在尝试设置一个函数,该函数将 运行 lm() 用于派生自 R 中用户定义矩阵的模型。
modelMatrix 将由用户设置,但预计结构如下:
source target
1 "PVC" "AA"
2 "Aro" "AA"
3 "PVC" "Aro"
该矩阵用于允许用户在 lm 中定义依赖(目标)和独立(源)变量,并引用另一个 valuesMatrix 的列名:
PVC Ar AA
[1,] -2.677875504 0.76141471 0.006114699
[2,] 0.330537781 -0.18462039 -0.265710261
[3,] 0.609826160 -0.62470233 0.715474554
我需要使用这个 modelMatrix 并生成相关数量的 lms。例如在这种情况下:
lm(AA ~ PVC + Aro)
和
lm(Aro ~ PVC)
我试过了,但似乎随着用户更改模型矩阵,它变得错误,我需要根据模型矩阵明确指定每个自变量。
```lm(as.formula(paste(unique(modelMatrix[,"target"])[1], "~ .",sep="")),
data=data.frame(valuesMatrix))
```
我是否需要设置 2 个循环(1 个嵌套)来获取源字符串和目标字符串并将它们粘贴到公式中,还是我忽略了一些细节。很困惑。
理想情况下,我希望用户能够更改 modelMatrix 以包含 1 个或多个 lms 以及每个 lm 的一个或多个自变量。非常感谢您的帮助,因为我真的在这里碰壁了。 谢谢。
对于您的具体示例,此代码应该有效 -
source <- c("PVC","Aro","PVC")
target <- c("AA","AA","Aro")
modelMatrix <- data.frame(source = source, target = target)
valuesMatrix <- as.matrix(rbind(c(-2.677875504,0.76141471,0.006114699), c(0.330537781,-0.18462039,-0.265710261),
c(0.609826160,-0.62470233,0.715474554)))
colnames(valuesMatrix) <- c("PVC","Aro","AA")
unique.target <- as.character(unique(modelMatrix$target))
lm.models <- lapply(unique.target, function(x) {lm(as.formula(paste(x,"~ .", sep = "")),
data = data.frame(valuesMatrix[,colnames(valuesMatrix) %in%
c(x,as.character(modelMatrix$source[which(modelMatrix$target==x)]))]))})
您可以使用 for 循环的想法,但 for 循环可能会非常昂贵,尤其是当您的 modelMatrix
变得非常大时。它可能看起来不那么吸引人,但 lapply
功能已针对此类工作进行了优化。唯一的其他技巧是保留执行 lm 所需的列。
您也可以提取每个 lm 的结果,但使用:
lm[[1]]
和 lm[[2]]