【问题标题】:loop lm predictions for plotting multiple lines用于绘制多条线的循环 lm 预测
【发布时间】:2017-11-17 06:31:23
【问题描述】:

我想为每个 ID 绘制线性模型线。

如何使用不同长度的序列为多个lms(或glms)创建预测?我试过了:

#some fake data
res<-runif(60,1,20)
var<-runif(60,10,50)
ID<-rep(c("A","B","B","C","C","C"),10)
data<- data.frame(ID,res,var)

#lm
library(data.table)
dt <- data.table(data,key="ID")
fits <- lapply(unique(data$ID),
function(z)lm(res~var, data=dt[J(z),], y=T))

#sequence for each ID of length var(ID)
mins<-matrix(with(data, tapply(var,ID,min)))
mins1<-mins[,1]
maxs<-matrix(with(data,tapply(var,ID,max)))
maxs1<-maxs[,1]
my_var<-list()
for(i in 1:3){
 my_var[[i]]<- seq(from=mins1[[i]],to=maxs1[[i]],by=1)
}

# predict on sequences
predslist<- list()
predslist[[i]] <- for(i in 1:3){
  dat<-fits[[i]]
  predict(dat,newdata= data.frame("var"= my_var,type= "response", se=TRUE))
}

预测结果错误

【问题讨论】:

  • 那么你到底卡在哪里了?绘图部分?你希望情节看起来像什么?我不确定我是否理解您想要的输出。
  • 这能回答你的问题吗? stackoverflow.com/questions/24356683/… 这是此 SO 搜索的三个热门之一。
  • 进一步的问题:???lms。我在 CRAN 中没有看到 lms 包。一定是发生了某种代码遗漏。
  • 我被困在脚本的最后一部分,我想预测序列上的模型。所需的输出是一个图,每个 ID 都有一条线。该行显示了 ID[i] 沿序列 [i] 的 lm 预测,其范围从 ID[i] 的 var 的最小值到最大值

标签: r loops subset lm predict


【解决方案1】:

你追求的是这样的东西吗?

# generating some fake data
ID <- rep(letters[1:4],each=10)
x <- rnorm(40,mean=5,sd=10)
y <- as.numeric(as.factor(ID))*x + rnorm(40)

# plotting in base R
plot(x, y, col=as.factor(ID), pch=16)

# calling lm() and adding lines
lmlist <- lapply(sort(unique(ID)), function(i) lm(y[ID==i]~x[ID==i]))
for(i in 1:length(lmlist)) abline(lmlist[[i]], col=i)

不知道绘图部分是否是您卡住的地方,但如果您传入从lm() 返回的对象,abline() 函数将绘制一条最小二乘线。

如果您希望最小二乘线以最小和最大 x 值开始和结束,这里有一个解决方法。它不漂亮,但似乎有效。

plot(x, y, col=as.factor(ID), pch=16)
IDnum <- as.numeric(as.factor(ID))
for(i in 1:length(lmlist)) lines(x[IDnum==i], predict(lmlist[[i]]), col=i)

【讨论】:

  • 谢谢,不错的短文。但我收到一个错误:错误:意外'for' in:“lmlist
  • 很抱歉 - 缺少括号。现已修复。
  • 谢谢,好文。唯一不理想的是线条的长度。它们应该只跨越 ID[i] 的 x 范围。
  • 非常感谢,完美。
【解决方案2】:

仅在 ggplot 中为 var[i] 范围绘制 lm 行:

library(ggplot2)
# create ID, x, y as coded by Matt
p <- qplot(x, y)
p + geom_smooth(aes(group=ID), method="lm", size=1, se=F)

【讨论】:

  • 不错!这更容易。
猜你喜欢
  • 2018-11-08
  • 2019-09-16
  • 2022-10-15
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多