Эффективный способ создать участок 10х10 в R - PullRequest
0 голосов
/ 04 февраля 2020

Я написал следующий фрагмент кода для создания графика 10x10 в приложении Shiny R. Я выполняю некоторые дополнительные вычисления (например, оценку квадрата R), что делает процесс еще более тяжелым / медленным, но я считаю, что существует совершенно другой и более эффективный способ создания следующего графика, а не итерация с использованием вложенных циклов for ,

output$plot2 <- renderPlot({
    par(mfrow=c(10,10))
    par(mar=c(0,0,0,0)+0.1)
    for (i in 0:9){
      for (j in 0:9){
        plot(df()[,c(paste0("intensity_",i), paste0("intensity_",j))], xlab=NULL, ylab=NULL, main=NULL, yaxt='n',xaxt='n', ann=FALSE)
        abline(fit <- lm(df()[,c(paste0("intensity_",i), paste0("intensity_",j))], data=df()), col='red')
        legend("topleft", bty="n", legend=format(summary(fit)$adj.r.squared, digits=3))
      }
    }
})

Приведенный выше код дает следующий рисунок: enter image description here

Не могли бы вы сообщить, есть ли лучший альтернативный способ сделать то, что приведет к тот же вывод более R-дружественным способом и в более короткий период времени?

* У df () есть 10 столбцов и тысячи числовых записей

1 Ответ

1 голос
/ 04 февраля 2020

Вы можете попробовать что-то вроде пар, поэтому половина вашего графика повторяется, поэтому для нижней половины я помещаю значения rsquare:

# Rsq for panel
panel.rsq <- function(x, y){
    usr <- par("usr"); on.exit(par(usr))
    par(usr = c(0, 1, 0, 1))
    r <- cor(x, y)
    txt <- paste0("R^2 = ", round(r^2,digits=2))
    cex.cor <- 0.8/strwidth(txt)
    text(0.5, 0.5, txt, cex = cex.cor * r)
}
# Customize upper panel
upper.panel<-function(x, y){
  points(x,y, pch = 19)
  abline(lm(y~x),col="red")
}


df = data.frame(replicate(10,1:100)+replicate(10,rnorm(100,20,5)))
pairs(df, 
      lower.panel = panel.rsq,
      upper.panel = upper.panel)

enter image description here

Если это все еще слишком медленно, возможно, вам придется использовать решетку ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...