回归模型在R中使用tapply()的BY类别

时间:2013-01-16 18:58:11

标签: r regression

我正在尝试使用tapply()函数来运行多个类别的模型,并且成功率不高。我的数据有20个诊所,我想在每个诊所运行模型。

继承我的模特:

attach(qregdata)
rq(logA~ dose+ chtcm + cage +raceth + sex,tau=.9)

我的数据作为可变诊所(值1-20)。有没有人知道如何在R中运行这个模型BY诊所和其他统计软件包一样?

3 个答案:

答案 0 :(得分:0)

以下显示了实现此目的的一般方法。 ddply函数为每个lm运行一个提供的函数(在本例中为clinic)。您还可以在更复杂的数据横截面上运行它。例如。 .(clinic,level)会针对cliniclevel的每个组合运行单独的模型。术语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简化为byarray

当然,存在执行此操作的更有效方法,但是如果您正在寻找类似list的解决方案-simplify = TRUE

下面是一个示例,该示例使用tapply回归by数据集中的萼片宽度“ lm”种类上的花瓣宽度:

by