我正在尝试使用tapply()
函数来运行多个类别的模型,并且成功率不高。我的数据有20个诊所,我想在每个诊所运行模型。
继承我的模特:
attach(qregdata)
rq(logA~ dose+ chtcm + cage +raceth + sex,tau=.9)
我的数据作为可变诊所(值1-20)。有没有人知道如何在R中运行这个模型BY诊所和其他统计软件包一样?
答案 0 :(得分:0)
以下显示了实现此目的的一般方法。 ddply
函数为每个lm
运行一个提供的函数(在本例中为clinic
)。您还可以在更复杂的数据横截面上运行它。例如。 .(clinic,level)
会针对clinic
和level
的每个组合运行单独的模型。术语lm(y~x)$coef[1]
获得线性模型的截距。我认为没有简单的方法可以同时保存每个模型的所有输出。
n <- 10
clinic <- factor(rep(1:3,each=n))
x <- rep(0:(n-1),3)
y <- rnorm(3*n)*x
d <- data.frame(clinic,x,y)
# plot data and linear fits
library(ggplot2)
ggplot(d,aes(x,y)) + geom_point() + facet_wrap(~clinic) + stat_smooth(method='lm')
# run a separate model for each clinic
library(plyr)
ddply(d,.(clinic),summarize,intercept=lm(y~x)$coef[1],slope=lm(y~x)$coef[2])
答案 1 :(得分:0)
您可以在诊所的唯一值中使用“lappy”,并使用子集来提取该诊所的数据集部分。然后将模型拟合到子集中。
这将返回一个模型列表,然后您可以进一步处理。
答案 2 :(得分:0)
我最近有一个与此类似的问题,并希望在有人仍对该主题感兴趣的情况下分享答复;很抱歉疏通旧帖子。
当输入对象(被“分割”的对象)是矢量时, tapply
的使用非常方便。如果要分割的输入对象是一个矩形数据集,则使用by
函数(在本例中为恰当命名)可能会更加简单,该函数可以方便地包装用于{{ 1}}个对象。 tapply
函数的返回对象属于data.frame
类,可以使用参数by
简化为by
或array
。
当然,存在执行此操作的更有效方法,但是如果您正在寻找类似list
的解决方案-simplify = TRUE
。
下面是一个示例,该示例使用tapply
回归by
数据集中的萼片宽度“ lm
”种类上的花瓣宽度:
by