【问题标题】:How to get predictions in NLME at the correct level instead of NAs?如何在 NLME 中获得正确级别的预测而不是 NA?
【发布时间】:2019-08-31 14:46:20
【问题描述】:

我有一个简单的实验(这里是一些虚构的数据),其中包含 3 个位置(“loc”)、位置内的块(“block”)、一组 8 个处理(“treat”)和一个响应变量( “响应”)。根据该数据调整指数平台函数(响应作为处理的函数),并使用 NLME 函数使用混合模型分析整个实验。指数平台函数的参数被认为是固定部分,而loc 和 block 是随机的。

我的问题在于模型的预测。我无法在 loc 级别获得对治疗反应的预测。我能够将其达到人口水平(固定效应),但是当尝试在 loc 水平上进行预测时,得到了所有 NA。我设置“levels=”选项的方式有问题吗?

这是我编造的数据

#dataframe
loc <- c("Loc1", "Loc2", "Loc3")
block <- c("Block_1", "Block_2", "Block_3", "Block_4")
treat <- as.numeric(c("0","40","80","120","160","200","240","280"))
empty <-expand.grid(treat,  block, loc)
response <- as.numeric(c(7064,  9250,   12306,  13549,  13300,  13973,   
                         14749,  14086, 7680, 11426, 12874,  12556,  14274,  14289,  15295,  14587, 
                         8445,   11588,  13223,  13322,  13508,  13616,  13747,  13352, 9454,     
                         11104,  12462,  13373,  14060,  14576,  14133,  14427, 5463, 8689,  10194,   
                         11996,  13475, 12544,   12856,  11557, 5251, 7537,  12074,  12438,  12120,   
                         11312,  9908, 12841, 4643,  7513,   10499,  12423,  12177,  12545,  12876,   
                         13047, 4992, 9458, 1071,    12104,  13552,  12602,  13210,  14428, 4061, 
                         3959,   5871,   8016,   9472, 11554,    12525,  12636, 4598, 7717,  7274,    
                         8476,   9433,   10768,  10275,  8200, 4862, 5727,   6468,   8532,   10662,   
                         12054,  12227,  12672, 5218, 7878, 8238, 10303, 10331,  13337,  12877,   
                         11661))
resp.data <- cbind(empty, response)
resp.data <- resp.data[c("Var3", "Var2", "Var1", "response")]
names(resp.data) <- c("loc", "block", "treat", "response")  

这是函数和模型的拟合

#exponential plateau function
expfunc <- function(beta0, beta1, beta2, x){
        y <- beta0 * (1 - exp(-exp(beta1) / 1000 * x + beta2))
        return(y)}

# model fit with blocks and locations as random effects
library(nlme)
exp.loc_block <- nlme(response ~ expfunc(beta0, beta1, beta2, treat),
                      data = resp.data,
                      fixed = list(beta0 ~ 1, beta1 ~ 1, beta2 ~ 1),
                      random = list(loc = pdDiag(beta0 + beta1 + beta2 ~ 1),
                                    block = pdDiag(beta0 + beta1 + beta2 ~ 1)),
                      start = c(12000, 3, -1),
                      na.action = na.omit,
                      verbose = F)

summary(exp.loc_block)

# This provides evidence that levels loc and block within loc are having random effects calculated
ranef(exp.loc_block)

这就是我做出预测的方式

#creation of the empty dataframe
#creation of the empty dataframe
xvals <- seq(min(resp.data$treat),max(resp.data$treat),length.out=100)
Loc.names.vector <- unique(resp.data$loc)
block <- c("Block_1","Block_2","Block_3","Block_4")
pframe.lp<-expand.grid(xvals, Loc.names.vector, block)
names(pframe.lp)[1]<-"treat"   
names(pframe.lp)[2]<-"loc"
names(pframe.lp)[3]<-"block"  
#prediction at location level (random effect)
pframe.lp$yield.exp <- predict(exp.loc_block,newdata=pframe.lp, level=0)
pframe.lp$yield.exp <- predict(exp.loc_block,newdata=pframe.lp, level=1)
pframe.lp$yield.exp <- predict(exp.loc_block,newdata=pframe.lp, level=2)

level=0 的预测适用于预测固定效应。级别 = 2 的预测适用于块/位置随机级别的预测 level=1 的预测给了我 NAs.. 这将是 loc 级别的预测,这是我最感兴趣的。

关卡选项有错误吗?

这里是使用 nlme 函数进行预测的解释 https://rdrr.io/cran/nlme/man/predict.nlme.html

【问题讨论】:

  • 我在pframe 中看不到块列。 newdata 参数需要与原始 data= 参数一致。
  • 是的,没错..但我希望在 loc 级别进行预测。这可行吗?
  • 当然可以,但是您需要为block 指定一些级别。可以都是同一个级别,但需要是原始数据范围内的值。
  • 好的。完美的。最后一个问题。如果我使用块 1 而不是块级别的块,结果会改变吗?
  • 我预计它会改变,假设您的意思是“Block1”与“Block2”,即现有级别..您为什么会期待其他情况?

标签: r nlme


【解决方案1】:

没有看到任何 NA。你能展示代码和足够的输出来记录你的问题吗? (我改为使用levels=0:2 并查看str(pframe.lp),然后从summary(pframe.lp$yield.exp$predict.loc) 获取此信息:

> pframe.lp$yield.exp <- predict(exp.loc_block,newdata=pframe.lp, level=0:2)
> 
> str(pframe.lp)
'data.frame':   1200 obs. of  4 variables:
 $ treat    : num  0 2.83 5.66 8.48 11.31 ...
 $ loc      : Factor w/ 3 levels "Loc1","Loc2",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ block    : Factor w/ 4 levels "Block_1","Block_2",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ yield.exp:'data.frame':  1200 obs. of  5 variables:
  ..$ loc          : Factor w/ 3 levels "Loc1","Loc2",..: 1 1 1 1 1 1 1 1 1 1 ...
  ..$ block        : Factor w/ 12 levels "Loc1/Block_1",..: 1 1 1 1 1 1 1 1 1 1 ...
  ..$ predict.fixed: num  5987 6188 6384 6575 6762 ...
  ..$ predict.loc  : num  7867 8125 8374 8613 8842 ...
  ..$ predict.block: num  7867 8121 8366 8601 8827 ...
 - attr(*, "out.attrs")=List of 2
  ..$ dim     : int  100 3 4
  ..$ dimnames:List of 3
  .. ..$ Var1: chr  "Var1=  0.000000" "Var1=  2.828283" "Var1=  5.656566" "Var1=  8.484848" ...
  .. ..$ Var2: chr  "Var2=Loc1" "Var2=Loc2" "Var2=Loc3"
  .. ..$ Var3: chr  "Var3=Block_1" "Var3=Block_2" "Var3=Block_3" "Var3=Block_4"
> summary(pframe.lp$yield.exp$predict.loc)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   4380    9219   11426   10928   13103   14279 

这种用法并不理想。将数据框添加到现有数据框是不好的 R 实践。更好的是:

pframe.lp$yield.exp <- data.matrix( predict( 
                                  exp.loc_block,newdata=pframe.lp, level=0:2) )

【讨论】:

  • 完美! “level = 0:2”就是诀窍。非常感谢@42- 的帮助和耐心。
猜你喜欢
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多