【问题标题】:Predict(), NewData with two column and differing rowsPredict(),具有两列和不同行的 NewData
【发布时间】:2018-07-10 09:42:39
【问题描述】:

我正在尝试对我的数据集 (df_22) 中的三个变量 (retweets,media,content) 进行预测,以在泊松、负二项式和零膨胀泊松之间进行选择。三个变量之一是响应变量 (retweets),另外两个是预测变量 (media,content)。

我实现了广义线性模型并且没有问题。

零膨胀泊松数据

 library("pscl")
 summary( m0 <- zeroinfl(retweets ~ media + content, data=df_22,dist="poisson") )

泊松

summary( m1 <- glm(formula=retweets ~ media + content, data=df_22, family="poisson"(link=log)))

负二项式

library (MASS) 
summary( m2 <- glm.nb(retweets ~ media + content, data=df_22) )

但是,当我创建新数据库进行预测时。我检查它的水平。

> levels(df_22$media)
[1] "other" "pic"   "pw"    "text"  "web"

> levels(df_22$content)
[1] "cultura"     "employ"      "environment" "other"       "security"    "sport"       "transport" 

我有问题。就是两列的行不同。

newmedia = c("other","pic","pw","text", "web")
newcontent = c("cultura","employ","environment","other","security","sport","transport")

nd = data.frame(media = newmedia, content = newcontent)

data.frame(media = newmedia, content = newcontent) 中的错误:参数暗示不同的行数:5、7

我应该怎么做才能解决这些问题?

我想解决这个问题,以便能够做出这些预测,以便我可以选择三个模型中的哪一个更适合我的数据。

p0 <- cbind(nd, Count = predict(m0, newdata = nd, type = "count"), Zero = predict(m0, newdata = nd, type = "zero"))

p1 <- cbind(nd, Mean = predict(m1, newdata = nd, type="response"), SE = predict(m1, newdata = nd, type="response", se.fit=T)$se.fit)

p2 <- cbind(nd, Mean = predict(m2, newdata = nd, type="response"), SE = predict(m2, newdata = nd, type="response", se.fit=T)$se.fit)

【问题讨论】:

  • 你的 data.frame nd 应该是什么样子?如果你想要所有组合,你可以试试nd&lt;-expand.grid(newmedia,newcontent) names(nd)&lt;-c("media","content")

标签: r multiple-columns prediction glm poisson


【解决方案1】:

在下面的code 中创建了一个示例data 集,它计算p0p1p2nb dataframe 的创建方式与 test dataframe 不同。

导入库

library(pscl)
library (MASS)

创建样本数据集

media <- c("other", "pic",   "pw",    "text",  "web")
content <- c("cultura", "employ", "environment", "other", "security", "sport", "transport")

set.seed(1)
retweets <- floor(abs(1e4*rnorm(1000)))
temp_index <- which(retweets %in% sample(retweets, 20)) # sample indexes
retweets[temp_index] <- 0 # set some retweets to zero to run zeroinfl()
df <- data.frame(retweets)
df$media <- sample(media, 1000, replace = TRUE)
df$content <- sample(content, 1000, replace = TRUE)
head(df)

unique(df$media)
unique(df$content)

创建测试数据集

注意:这里,测试数据集是从训练数据中提取的,仅用于说明目的。理想情况下,它应该是一组新数据。

nd = df[sample(nrow(df), 300), ] # ideally this should not be from the train data, this is just for an example code
nd_X <- test[,c('media', 'content')]
nd_Y <- test[,c('retweets')]

适合型号:zeroinf(dist='poisson')glm(family='poisson')glm.nb()

# Poisson
summary( m0 <- zeroinfl(retweets ~ media + content, data=df, dist="poisson") )

# Binomial
summary( m1 <- glm(formula=retweets ~ media + content, data=df, family="poisson"(link=log)))

# glm()
#summary( m2 <- glm.nb(retweets ~ media + content, data=df) )  # gives error in summary due to zeros
summary( m2 <- glm.nb(retweets ~ media + content, data=df[df$retweets!=0,]) ) # no error without zeros

Predict 使用test data 设置

p0 <- cbind(nd, Count = predict(m0, newdata = nd_X, type = "count"), Zero = predict(m0, newdata = nd, type = "zero"))
p1 <- cbind(nd, Mean = predict(m1, newdata = nd_X, type="response"), SE = predict(m1, newdata = nd, type="response", se.fit=T)$se.fit)
p2 <- cbind(nd, Mean = predict(m2, newdata = nd_X, type="response"), SE = predict(m2, newdata = nd, type="response", se.fit=T)$se.fit)

输出:

【讨论】:

    猜你喜欢
    • 2016-10-28
    • 2016-09-25
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多