我正在尝试设置一个函数,该函数将在从R中用户定义的矩阵派生的模型上运行lm()。
modelMatrix将由用户设置,但预计结构如下:
source target
1 "PVC" "AA"
2 "Aro" "AA"
3 "PVC" "Aro"
该矩阵用于允许用户在lm中定义相关(目标)和独立(源)变量,并引用另一个值矩阵的列名:
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)
我试过这个,但似乎当用户更改模型矩阵时,它会变得错误,我需要根据modelMatrix明确指定每个自变量。
```lm(as.formula(paste(unique(modelMatrix[,"target"])[1], "~ .",sep="")),
data=data.frame(valuesMatrix))
```
我是否需要设置2个循环(1个嵌套)来获取源和目标字符串并将其粘贴到公式中或者我忽略了一些细节。很困惑。
理想情况下,我希望用户能够更改modelMatrix以包含1个或多个lms以及每个lm的一个或多个独立变量。我真的很感谢你的协助,因为我真的在这里碰壁了。 谢谢。
答案 0 :(得分:1)
对于您的具体示例,此代码应该有效 -
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]]