多个模型循环

问题描述 投票:0回答:1

我有一个像这样的模型(见下文),我需要为每一行数据运行它。在该示例中,有 9 个观察值。我正在尝试创建一个循环来运行模型与观察次数一样多的次数,但我还需要将每个值放入 data.frame 中。是否可以获取包含不同模型的每个值的 data.frame?比如:

结果<- as.data.frame(c(0.29,0.30,0.27,0.25,0.31,0.30,0.32,0.33,0.29))

####Model####
#Model from Estabroke and Neale 2013
require(OpenMx)

V1 <- c(1,2.4,6,8,9,5,6,7,8)
V2 <- c(1,3,6,8.6,9,6,6,7,8)
V3 <- c(1,3,6,5,9.2,5,6,7,8)
V4 <- c(1,7,6,9,9,5.5,6,6,8)
V5 <- c(1,2,2,8,5.4,5,6,5,8)

exampleData <-as.data.frame(cbind(V1,V2,V3,V4,V5))

factorModel <- mxModel("Initial Model",
                       mxData(exampleData, "raw"),
                       mxMatrix(type="Full", nrow=1, ncol=5,
                                free=TRUE, values=0, name="alpha"),
                       mxMatrix("Full", 1, 1, FALSE, 0, name="mu"),
                       mxMatrix("Full", 1, 5, TRUE, 0.8, name="lambda"),
                       mxMatrix("Symm", 1, 1, FALSE, 1, name="phi"),mxMatrix("Diag", 5, 5, TRUE, 0.6, name="theta"),
                       mxAlgebra(t(lambda) %*% phi %*% lambda + theta, name="cov"),
                       mxAlgebra(alpha + mu %*% lambda, name="mean"),
                       
                       mxExpectationNormal(covariance = "cov", means = "mean", dimnames=names(exampleData)),
                       mxFitFunctionML())

factorResults <- mxRun(factorModel)
fsModel <- mxModel(factorResults, name="FactorScore")

fsModel$alpha@free[,] <- FALSE
fsModel$lambda@free[,] <- FALSE
fsModel$theta@free[,] <- FALSE
fsModel$mu@free[,] <- TRUE

fsModel@expectation  <- mxExpectationNormal("theta", "mean",names(exampleData))

fsModel@data <- mxData(exampleData[1,], "raw")

fullModel <- mxModel("Weighted Factor Score Model",
                     fsModel,
                     mxAlgebra(1 / ((2*pi)^(1/2) * sqrt(det(FactorScore.phi))) *
                                 exp(-.5*(FactorScore.mu %&% solve(FactorScore.phi))),
                               name="weight"),
                     mxAlgebra(-2*log(weight %x% FactorScore.objective),
                               name="alg"),
                     mxAlgebraObjective("alg"))

fsResults <- mxRun(fullModel)

fsResults$weight$result[1,1]

我需要更改此行来运行它(因此在本例中运行 9 次)

fsModel@data <- mxData(exampleData[1,], "raw")
fsModel@data <- mxData(exampleData[2,], "raw")
fsModel@data <- mxData(exampleData[3,], "raw")

...

fsModel@data <- mxData(exampleData[9,], "raw")

提前非常感谢您

r loops
1个回答
0
投票

您可以将所有建模代码包装在一个函数中,然后逐行应用于您的

exampleData
:

exampleData <- data.frame(
  V1 = c(1, 2.4, 6, 8, 9, 5, 6, 7, 8),
  V2 = c(1, 3, 6, 8.6, 9, 6, 6, 7, 8),
  V3 = c(1, 3, 6, 5, 9.2, 5, 6, 7, 8),
  V4 = c(1, 7, 6, 9, 9, 5.5, 6, 6, 8),
  V5 = c(1, 2, 2, 8, 5.4, 5, 6, 5, 8)
)
get_fsModel_result <- function(one_row){
  ## ...
  fsModel@data <- mxData(one_row, "raw")
  ## ...
  ## return result:
  fsResults$weight$result[1, 1]   
}
data.frame(result = apply(exampleData, MARGIN = 1, get_fsModel_result))
© www.soinside.com 2019 - 2024. All rights reserved.