在R

时间:2016-03-12 07:35:22

标签: r matrix lm

我正在尝试设置一个函数,该函数将在从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的一个或多个独立变量。我真的很感谢你的协助,因为我真的在这里碰壁了。 谢谢。

1 个答案:

答案 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]]